diff --git a/docs/coverage.md b/docs/coverage.md index af1d7c6..2c3020c 100644 --- a/docs/coverage.md +++ b/docs/coverage.md @@ -3,10 +3,11 @@ 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 | +| algopy.Array | Native | | algopy.BigUInt | Native | | algopy.Box | Emulated | | algopy.BoxMap | Emulated | @@ -16,14 +17,19 @@ See which `algorand-python` stubs are implemented by the `algorand-python-testin | algopy.CompiledContract | Mockable | | algopy.CompiledLogicSig | Mockable | | algopy.Contract | Emulated | +| algopy.FixedArray | Native | | algopy.Global | Emulated | | algopy.GlobalState | Emulated | +| algopy.ImmutableArray | Native | +| algopy.ImmutableFixedArray | Native | | algopy.LocalState | Emulated | | algopy.LogicSig | Emulated | | algopy.OnCompleteAction | Native | | algopy.OpUpFeeSource | Native | +| algopy.ReferenceArray | Native | | algopy.StateTotals | Emulated | | algopy.String | Native | +| algopy.Struct | Native | | algopy.TemplateVar | Emulated | | algopy.TransactionType | Native | | algopy.Txn | Emulated | diff --git a/docs/testing-guide/concepts.md b/docs/testing-guide/concepts.md index 60772f8..f476c1d 100644 --- a/docs/testing-guide/concepts.md +++ b/docs/testing-guide/concepts.md @@ -58,3 +58,8 @@ As explained in the [introduction](index.md), `algorand-python-testing` _injects 3. **Mockable**: Not implemented, but can be mocked or patched. For example, `algopy.abi_call` can be mocked to return specific values or behaviours; otherwise, it raises a `NotImplementedError`. This category covers cases where native or emulated implementation in a unit test context is impractical or overly complex. For a full list of all public `algopy` types and their corresponding implementation category, refer to the [Coverage](../coverage.md) section. + +## Data Validation + +Algorand Python and the puya compiler have functionality to perform validation of transaction inputs via the `--validate-abi-args`, `--validate-abi-return` CLI arguments, `arc4.abimethod(validate_encoding=...)` decorator and `.validate()` methods. +The Algorand Python Testing library does *NOT* implement this validation behaviour, as you should test invalid inputs using an integrated test against a real Algorand network. diff --git a/scripts/refresh_test_artifacts.py b/scripts/refresh_test_artifacts.py index 0b00a4d..5c66cb0 100644 --- a/scripts/refresh_test_artifacts.py +++ b/scripts/refresh_test_artifacts.py @@ -31,6 +31,10 @@ def compile_contract(folder: Path) -> None: str(contract_path), "--out-dir", "data", + # testing library does not perform ABI validation + # so ensure compiled contracts also do not, so behaviour matches + "--no-validate-abi-args", + "--no-validate-abi-return", ] subprocess.run( compile_cmd, diff --git a/scripts/validate_examples.py b/scripts/validate_examples.py index 545d05a..b80a0f1 100644 --- a/scripts/validate_examples.py +++ b/scripts/validate_examples.py @@ -70,9 +70,11 @@ def generate_client(folder: Path) -> None: text=True, ) except subprocess.CalledProcessError as e: - if "No app specs" in e.stderr: + output = e.stdout + e.stderr + if "No app specs" in output: logger.warning(f"No app spec found for: {folder}, skipping...") else: + logger.exception(output) raise diff --git a/src/_algopy_testing/arc4.py b/src/_algopy_testing/arc4.py index 1da93b5..0917ec6 100644 --- a/src/_algopy_testing/arc4.py +++ b/src/_algopy_testing/arc4.py @@ -158,6 +158,9 @@ def bytes(self) -> algopy.Bytes: return algopy.Bytes(self._value) + def validate(self) -> None: + pass + def __eq__(self, other: object) -> bool: if isinstance(other, _ABIEncoded): return self._type_info == other._type_info and self.bytes == other.bytes diff --git a/src/_algopy_testing/decorators/arc4.py b/src/_algopy_testing/decorators/arc4.py index 5021543..d75a974 100644 --- a/src/_algopy_testing/decorators/arc4.py +++ b/src/_algopy_testing/decorators/arc4.py @@ -151,6 +151,7 @@ def abimethod( # noqa: PLR0913 resource_encoding: _ResourceEncoding = "value", readonly: bool = False, default_args: Mapping[str, str | object] | None = None, + validate_encoding: typing.Literal["unsafe_disabled", "args"] = "args", # noqa: ARG001 ) -> Callable[[Callable[_P, _R]], Callable[_P, _R]] | Callable[_P, _R]: from _algopy_testing.utilities.log import log diff --git a/src/_algopy_testing/models/account.py b/src/_algopy_testing/models/account.py index 58c6da2..73181bb 100644 --- a/src/_algopy_testing/models/account.py +++ b/src/_algopy_testing/models/account.py @@ -128,6 +128,9 @@ def bytes(self) -> Bytes: def public_key(self) -> str: return algosdk.encoding.encode_address(self._public_key) # type: ignore[no-any-return] + def validate(self) -> None: + pass + def __getattr__(self, name: str) -> typing.Any: try: return self.data.fields[name] # type: ignore[literal-required] diff --git a/src/_algopy_testing/primitives/array.py b/src/_algopy_testing/primitives/array.py index 404e9bc..15dfb82 100644 --- a/src/_algopy_testing/primitives/array.py +++ b/src/_algopy_testing/primitives/array.py @@ -144,6 +144,9 @@ def serialize(self) -> bytes: def from_bytes(cls, value: bytes, /) -> typing.Self: return deserialize_from_bytes(cls, value) + def validate(self) -> None: + pass + class _FixedArrayMeta(type, typing.Generic[_TArrayItem, _TArrayLength]): __concrete__: typing.ClassVar[dict[tuple[type, type], type]] = {} @@ -255,6 +258,9 @@ def serialize(self) -> bytes: def from_bytes(cls, value: bytes, /) -> typing.Self: return deserialize_from_bytes(cls, value) + def validate(self) -> None: + pass + class _ImmutableArrayMeta(type): __concrete__: typing.ClassVar[dict[type, type]] = {} @@ -362,6 +368,9 @@ def serialize(self) -> bytes: def from_bytes(cls, value: bytes, /) -> typing.Self: return deserialize_from_bytes(cls, value) + def validate(self) -> None: + pass + class ReferenceArray(Reversible[_TArrayItem]): def __init__(self, values: Iterable[_TArrayItem] = ()): @@ -510,6 +519,9 @@ def serialize(self) -> bytes: def from_bytes(cls, value: bytes, /) -> typing.Self: return deserialize_from_bytes(cls, value) + def validate(self) -> None: + pass + @typing.dataclass_transform() class Struct(Serializable, MutableBytes): @@ -558,6 +570,9 @@ def from_bytes(cls, value: bytes, /) -> typing.Self: def _update_backing_value(self) -> None: self._value = serialize_to_bytes(self) + def validate(self) -> None: + pass + def zero_bytes(typ: type[_T]) -> _T: # Get the static size of the type diff --git a/tests/artifacts/AVM12/data/Contract.approval.teal b/tests/artifacts/AVM12/data/Contract.approval.teal index 46746d4..cb7794d 100644 --- a/tests/artifacts/AVM12/data/Contract.approval.teal +++ b/tests/artifacts/AVM12/data/Contract.approval.teal @@ -3,7 +3,7 @@ // algopy.arc4.ARC4Contract.approval_program() -> uint64: main: - intcblock 6 0 1 + intcblock 1 6 0 bytecblock base64(DIEBQw==) // tests/artifacts/AVM12/contract.py:4 // class Contract(ARC4Contract, avm_version=12): @@ -25,7 +25,9 @@ main___algopy_default_create@9: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.AVM12.contract.Contract.test_falcon_verify[routing]() -> void: @@ -51,11 +53,11 @@ test_reject_version: itxn_begin bytec_0 // base64(DIEBQw==) itxn_field ClearStateProgramPages - pushbytes base64(DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESQw==) + pushbytes base64(DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAsxGRQxGBQQRIEBQzFEgQESRIEBQw==) itxn_field ApprovalProgramPages - intc_0 // appl + intc_1 // appl itxn_field TypeEnum - intc_1 // 0 + intc_2 // 0 itxn_field Fee itxn_submit itxn CreatedApplicationID @@ -75,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(DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISQw==) + pushbytes base64(DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAsxGRQxGBQQRIEBQzFEgQISRIEBQw==) itxn_field ApprovalProgramPages // tests/artifacts/AVM12/contract.py:15-17 // arc4.arc4_update( @@ -85,7 +87,7 @@ test_reject_version: itxn_field OnCompletion // tests/artifacts/AVM12/contract.py:16 // ContractV0.update, app_id=app, reject_version=1, compiled=compile_contract(ContractV1) - intc_2 // 1 + intc_0 // 1 itxn_field RejectVersion dup itxn_field ApplicationID @@ -95,9 +97,9 @@ test_reject_version: // ) pushbytes 0xa0e81872 // method "update()void" itxn_field ApplicationArgs - intc_0 // appl + intc_1 // appl itxn_field TypeEnum - intc_1 // 0 + intc_2 // 0 itxn_field Fee itxn_submit // tests/artifacts/AVM12/contract.py:18 @@ -105,7 +107,7 @@ test_reject_version: dup app_params_get AppVersion assert // application exists - intc_2 // 1 + intc_0 // 1 == assert // should be version 1 // tests/artifacts/AVM12/contract.py:20-29 @@ -137,9 +139,9 @@ test_reject_version: itxn_field ApplicationArgs // tests/artifacts/AVM12/contract.py:20 // itxn.ApplicationCall( - intc_0 // appl + intc_1 // appl itxn_field TypeEnum - intc_1 // 0 + intc_2 // 0 itxn_field Fee // tests/artifacts/AVM12/contract.py:20-29 // itxn.ApplicationCall( @@ -155,5 +157,5 @@ test_reject_version: itxn_submit // tests/artifacts/AVM12/contract.py:9 // @arc4.abimethod - intc_2 // 1 + intc_0 // 1 return diff --git a/tests/artifacts/AVM12/data/Contract.arc56.json b/tests/artifacts/AVM12/data/Contract.arc56.json index 778489b..8d3ae9f 100644 --- a/tests/artifacts/AVM12/data/Contract.arc56.json +++ b/tests/artifacts/AVM12/data/Contract.arc56.json @@ -85,20 +85,20 @@ }, { "pc": [ - 133, - 218 + 141, + 232 ], "errorMessage": "application exists" }, { "pc": [ - 135 + 143 ], "errorMessage": "should be version 0" }, { "pc": [ - 221 + 235 ], "errorMessage": "should be version 1" } @@ -111,19 +111,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA2IDAgMQogICAgYnl0ZWNibG9jayBiYXNlNjQoRElFQlF3PT0pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMik6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGJlNTY0OTljIDB4YWM4YWFiNDIgLy8gbWV0aG9kICJ0ZXN0X2ZhbGNvbl92ZXJpZnkoKXZvaWQiLCBtZXRob2QgInRlc3RfcmVqZWN0X3ZlcnNpb24oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2ZhbGNvbl92ZXJpZnkgdGVzdF9yZWplY3RfdmVyc2lvbgogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9mYWxjb25fdmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9mYWxjb25fdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBub3Qgb3AuZmFsY29uX3ZlcmlmeShiIiIsIGIiIiwgb3AuYnplcm8oMTc5MykpCiAgICBwdXNoaW50IDE3OTMgLy8gMTc5MwogICAgYnplcm8KICAgIHB1c2hieXRlcyAweAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGZhbGNvbl92ZXJpZnkKICAgICEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdC50ZXN0X3JlamVjdF92ZXJzaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWplY3RfdmVyc2lvbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxMQogICAgLy8gYXBwX3YwX3R4biA9IGFyYzQuYXJjNF9jcmVhdGUoQ29udHJhY3RWMCkKICAgIGl0eG5fYmVnaW4KICAgIGJ5dGVjXzAgLy8gYmFzZTY0KERJRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBwdXNoYnl0ZXMgYmFzZTY0KERERWJRUUFhZ0FTZzZCaHlOaG9BamdFQUFRQXhHWUVFRWpFWUVFUkNBQWd4R1JReEdCUVFRekZFZ1FFU1F3PT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBpbnRjXzAgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBhc3NlcnQgYXBwLnZlcnNpb24gPT0gMCwgInNob3VsZCBiZSB2ZXJzaW9uIDAiCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcFZlcnNpb24KICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBzaG91bGQgYmUgdmVyc2lvbiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNgogICAgLy8gQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIGJ5dGVjXzAgLy8gYmFzZTY0KERJRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBwdXNoYnl0ZXMgYmFzZTY0KERERWJRUUFhZ0FRa040MDhOaG9BamdFQUFRQXhHWUVGRWpFWUVFUkNBQWd4R1JReEdCUVFRekZFZ1FJU1F3PT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNgogICAgLy8gQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIFJlamVjdFZlcnNpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMCAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAxLCAic2hvdWxkIGJlIHZlcnNpb24gMSIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gc2hvdWxkIGJlIHZlcnNpb24gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjgKICAgIC8vIHJlamVjdF92ZXJzaW9uPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBSZWplY3RWZXJzaW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToyNgogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIyLTI0CiAgICAvLyBhcmM0LmFyYzRfc2lnbmF0dXJlKAogICAgLy8gICAgIENvbnRyYWN0VjEuZGVsZXRlLAogICAgLy8gKSwKICAgIHB1c2hieXRlcyAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToyMAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzAgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjAtMjkKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPSgKICAgIC8vICAgICAgICAgYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIC8vICAgICAgICAgICAgIENvbnRyYWN0VjEuZGVsZXRlLAogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyAgICAgcmVqZWN0X3ZlcnNpb249MiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMAogICAgYnl0ZWNibG9jayBiYXNlNjQoRElFQlF3PT0pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMik6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGJlNTY0OTljIDB4YWM4YWFiNDIgLy8gbWV0aG9kICJ0ZXN0X2ZhbGNvbl92ZXJpZnkoKXZvaWQiLCBtZXRob2QgInRlc3RfcmVqZWN0X3ZlcnNpb24oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2ZhbGNvbl92ZXJpZnkgdGVzdF9yZWplY3RfdmVyc2lvbgogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdC50ZXN0X2ZhbGNvbl92ZXJpZnlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ZhbGNvbl92ZXJpZnk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NwogICAgLy8gYXNzZXJ0IG5vdCBvcC5mYWxjb25fdmVyaWZ5KGIiIiwgYiIiLCBvcC5iemVybygxNzkzKSkKICAgIHB1c2hpbnQgMTc5MyAvLyAxNzkzCiAgICBiemVybwogICAgcHVzaGJ5dGVzIDB4CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZmFsY29uX3ZlcmlmeQogICAgIQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFWTTEyLmNvbnRyYWN0LkNvbnRyYWN0LnRlc3RfcmVqZWN0X3ZlcnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3JlamVjdF92ZXJzaW9uOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjExCiAgICAvLyBhcHBfdjBfdHhuID0gYXJjNC5hcmM0X2NyZWF0ZShDb250cmFjdFYwKQogICAgaXR4bl9iZWdpbgogICAgYnl0ZWNfMCAvLyBiYXNlNjQoRElFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoRERFYlFRQWFnQVNnNkJoeU5ob0FqZ0VBQVFBeEdZRUVFakVZRUVSQ0FBc3hHUlF4R0JRUVJJRUJRekZFZ1FFU1JJRUJRdz09KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxMwogICAgLy8gYXNzZXJ0IGFwcC52ZXJzaW9uID09IDAsICJzaG91bGQgYmUgdmVyc2lvbiAwIgogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBWZXJzaW9uCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gc2hvdWxkIGJlIHZlcnNpb24gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjE1LTE3CiAgICAvLyBhcmM0LmFyYzRfdXBkYXRlKAogICAgLy8gICAgIENvbnRyYWN0VjAudXBkYXRlLCBhcHBfaWQ9YXBwLCByZWplY3RfdmVyc2lvbj0xLCBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KENvbnRyYWN0VjEpCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTYKICAgIC8vIENvbnRyYWN0VjAudXBkYXRlLCBhcHBfaWQ9YXBwLCByZWplY3RfdmVyc2lvbj0xLCBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KENvbnRyYWN0VjEpCiAgICBieXRlY18wIC8vIGJhc2U2NChESUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChEREViUVFBYWdBUWtONDA4TmhvQWpnRUFBUUF4R1lFRkVqRVlFRVJDQUFzeEdSUXhHQlFRUklFQlF6RkVnUUlTUklFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNgogICAgLy8gQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIGludGNfMCAvLyAxCiAgICBpdHhuX2ZpZWxkIFJlamVjdFZlcnNpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAxLCAic2hvdWxkIGJlIHZlcnNpb24gMSIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gc2hvdWxkIGJlIHZlcnNpb24gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjgKICAgIC8vIHJlamVjdF92ZXJzaW9uPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBSZWplY3RWZXJzaW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToyNgogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIyLTI0CiAgICAvLyBhcmM0LmFyYzRfc2lnbmF0dXJlKAogICAgLy8gICAgIENvbnRyYWN0VjEuZGVsZXRlLAogICAgLy8gKSwKICAgIHB1c2hieXRlcyAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToyMAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18yIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjAtMjkKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPSgKICAgIC8vICAgICAgICAgYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIC8vICAgICAgICAgICAgIENvbnRyYWN0VjEuZGVsZXRlLAogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyAgICAgcmVqZWN0X3ZlcnNpb249MiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "DCADBgABJgEEDIEBQzEbQQAdMRkURDEYRIICBL5WSZwErIqrQjYaAI4CAAkAFQAxGRQxGBQQQ4GBDq+AAElPAoUUQ7EoskKALgwxG0EAGoAEoOgYcjYaAI4BAAEAMRmBBBIxGBBEQgAIMRkUMRgUEEMxRIEBEkOyQCKyECOyAbO0PUlyCUQURLEoskKALgwxG0EAGoAEJDeNPDYaAI4BAAEAMRmBBRIxGBBEQgAIMRkUMRgUEEMxRIECEkOyQIEEshkkskRJshiABKDoGHKyGiKyECOyAbNJcglEJBJEsYECskSyGIEFshmABCQ3jTyyGiKyECOyAbMkQw==", + "approval": "DCADAQYAJgEEDIEBQzEbQQAdMRkURDEYRIICBL5WSZwErIqrQjYaAI4CAAsAFwAxGRQxGBQQRCJDgYEOr4AASU8ChRRDsSiyQoA0DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAsxGRQxGBQQRIEBQzFEgQESRIEBQ7JAI7IQJLIBs7Q9SXIJRBREsSiyQoA0DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAsxGRQxGBQQRIEBQzFEgQISRIEBQ7JAgQSyGSKyREmyGIAEoOgYcrIaI7IQJLIBs0lyCUQiEkSxgQKyRLIYgQWyGYAEJDeNPLIaI7IQJLIBsyJD", "clear": "DIEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/AVM12/data/ContractV0.approval.teal b/tests/artifacts/AVM12/data/ContractV0.approval.teal index e3a44c4..5ab3054 100644 --- a/tests/artifacts/AVM12/data/ContractV0.approval.teal +++ b/tests/artifacts/AVM12/data/ContractV0.approval.teal @@ -29,7 +29,9 @@ main___algopy_default_create@5: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + pushint 1 // 1 + return // tests.artifacts.AVM12.contract.ContractV0.update[routing]() -> void: @@ -39,6 +41,12 @@ update: txn RejectVersion pushint 1 // 1 == + // tests/artifacts/AVM12/contract.py:35-37 + // assert ( + // Txn.reject_version == 1 + // ), "can only update if caller expects this to be currently be v0" + assert // can only update if caller expects this to be currently be v0 // tests/artifacts/AVM12/contract.py:33 // @arc4.abimethod(allow_actions=("UpdateApplication",)) - return // on error: can only update if caller expects this to be currently be v0 + pushint 1 // 1 + return diff --git a/tests/artifacts/AVM12/data/ContractV0.arc56.json b/tests/artifacts/AVM12/data/ContractV0.arc56.json index 14b3759..f4bfd8c 100644 --- a/tests/artifacts/AVM12/data/ContractV0.arc56.json +++ b/tests/artifacts/AVM12/data/ContractV0.arc56.json @@ -69,7 +69,7 @@ }, { "pc": [ - 45 + 48 ], "errorMessage": "can only update if caller expects this to be currently be v0" } @@ -82,19 +82,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozMgogICAgLy8gY2xhc3MgQ29udHJhY3RWMChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl91cGRhdGVfcm91dGVAMwogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIlVwZGF0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgVXBkYXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiB1cGRhdGUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYwLnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozNgogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDEgLy8gMQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9KCJVcGRhdGVBcHBsaWNhdGlvbiIsKSkKICAgIHJldHVybiAvLyBvbiBlcnJvcjogY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYwCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozMgogICAgLy8gY2xhc3MgQ29udHJhY3RWMChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl91cGRhdGVfcm91dGVAMwogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIlVwZGF0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgVXBkYXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiB1cGRhdGUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFWTTEyLmNvbnRyYWN0LkNvbnRyYWN0VjAudXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBUeG4ucmVqZWN0X3ZlcnNpb24gPT0gMQogICAgdHhuIFJlamVjdFZlcnNpb24KICAgIHB1c2hpbnQgMSAvLyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjM1LTM3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5yZWplY3RfdmVyc2lvbiA9PSAxCiAgICAvLyApLCAiY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYwIgogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IHVwZGF0ZSBpZiBjYWxsZXIgZXhwZWN0cyB0aGlzIHRvIGJlIGN1cnJlbnRseSBiZSB2MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIlVwZGF0ZUFwcGxpY2F0aW9uIiwpKQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESQw==", + "approval": "DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAsxGRQxGBQQRIEBQzFEgQESRIEBQw==", "clear": "DIEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/AVM12/data/ContractV1.approval.teal b/tests/artifacts/AVM12/data/ContractV1.approval.teal index db64f60..57ad322 100644 --- a/tests/artifacts/AVM12/data/ContractV1.approval.teal +++ b/tests/artifacts/AVM12/data/ContractV1.approval.teal @@ -29,7 +29,9 @@ main___algopy_default_create@5: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + pushint 1 // 1 + return // tests.artifacts.AVM12.contract.ContractV1.delete[routing]() -> void: @@ -39,6 +41,12 @@ delete: txn RejectVersion pushint 2 // 2 == + // tests/artifacts/AVM12/contract.py:43-45 + // assert ( + // Txn.reject_version == 2 + // ), "can only update if caller expects this to be currently be v1" + assert // can only update if caller expects this to be currently be v1 // tests/artifacts/AVM12/contract.py:41 // @arc4.abimethod(allow_actions=("DeleteApplication",)) - return // on error: can only update if caller expects this to be currently be v1 + pushint 1 // 1 + return diff --git a/tests/artifacts/AVM12/data/ContractV1.arc56.json b/tests/artifacts/AVM12/data/ContractV1.arc56.json index bbee0c3..7e07a8d 100644 --- a/tests/artifacts/AVM12/data/ContractV1.arc56.json +++ b/tests/artifacts/AVM12/data/ContractV1.arc56.json @@ -69,7 +69,7 @@ }, { "pc": [ - 45 + 48 ], "errorMessage": "can only update if caller expects this to be currently be v1" } @@ -82,19 +82,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0MAogICAgLy8gY2xhc3MgQ29udHJhY3RWMShBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZWxldGVfcm91dGVAMwogICAgZXJyCgptYWluX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIkRlbGV0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgRGVsZXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBkZWxldGUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYxLmRlbGV0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0NAogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9KCJEZWxldGVBcHBsaWNhdGlvbiIsKSkKICAgIHJldHVybiAvLyBvbiBlcnJvcjogY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYxCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0MAogICAgLy8gY2xhc3MgQ29udHJhY3RWMShBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZWxldGVfcm91dGVAMwogICAgZXJyCgptYWluX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIkRlbGV0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgRGVsZXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBkZWxldGUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFWTTEyLmNvbnRyYWN0LkNvbnRyYWN0VjEuZGVsZXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBUeG4ucmVqZWN0X3ZlcnNpb24gPT0gMgogICAgdHhuIFJlamVjdFZlcnNpb24KICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQzLTQ1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5yZWplY3RfdmVyc2lvbiA9PSAyCiAgICAvLyApLCAiY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYxIgogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IHVwZGF0ZSBpZiBjYWxsZXIgZXhwZWN0cyB0aGlzIHRvIGJlIGN1cnJlbnRseSBiZSB2MQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIkRlbGV0ZUFwcGxpY2F0aW9uIiwpKQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISQw==", + "approval": "DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAsxGRQxGBQQRIEBQzFEgQISRIEBQw==", "clear": "DIEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/Arc4ABIMethod/contract.py b/tests/artifacts/Arc4ABIMethod/contract.py index f867065..aabcef5 100644 --- a/tests/artifacts/Arc4ABIMethod/contract.py +++ b/tests/artifacts/Arc4ABIMethod/contract.py @@ -33,7 +33,7 @@ def create(self) -> None: assert app_txn.app_id == 0, "expected txn to have 0" assert Txn.application_id == 0, "expected txn to have 0" - @arc4.abimethod + @arc4.abimethod(validate_encoding="unsafe_disabled") def sink(self, value: arc4.String, arr: UInt8Array) -> None: assert value assert arr @@ -84,6 +84,7 @@ def with_acc(self, value: arc4.String, acc: Account, arr: UInt8Array) -> None: def complex_sig( self, struct1: MyStruct, txn: algopy.gtxn.Transaction, acc: Account, five: UInt8Array ) -> tuple[MyStructAlias, MyStruct]: + five.validate() assert Txn.num_app_args == 4 # struct assert struct1.another_struct.one == 1 @@ -123,6 +124,7 @@ def echo_resource_by_index( def echo_resource_by_value( self, asset: Asset, app: Application, acc: Account ) -> tuple[Asset, Application, Account]: + acc.validate() asset_id = op.btoi(Txn.application_args(1)) assert asset.id == asset_id, "expected asset to be passed by value" app_id = op.btoi(Txn.application_args(2)) diff --git a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal index 1218847..9b1379f 100644 --- a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal +++ b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal @@ -61,15 +61,17 @@ create: // assert Txn.application_id == 0, "expected txn to have 0" txn ApplicationID ! + assert // expected txn to have 0 // tests/artifacts/Arc4ABIMethod/contract.py:26 // @arc4.abimethod(create="require") - return // on error: expected txn to have 0 + intc_0 // 1 + return // tests.artifacts.Arc4ABIMethod.contract.SignaturesContract.sink[routing]() -> void: sink: // tests/artifacts/Arc4ABIMethod/contract.py:36 - // @arc4.abimethod + // @arc4.abimethod(validate_encoding="unsafe_disabled") txna ApplicationArgs 2 txna ApplicationArgs 1 // tests/artifacts/Arc4ABIMethod/contract.py:38 @@ -82,7 +84,7 @@ sink: bytec_0 // 0x0000 != // tests/artifacts/Arc4ABIMethod/contract.py:36 - // @arc4.abimethod + // @arc4.abimethod(validate_encoding="unsafe_disabled") return @@ -325,12 +327,23 @@ complex_sig: txnas Accounts txna ApplicationArgs 3 // tests/artifacts/Arc4ABIMethod/contract.py:87 + // five.validate() + dup + intc_1 // 0 + extract_uint16 // on error: invalid array length header + pushint 2 // 2 + + + dig 1 + len + == + assert // invalid number of bytes for arc4.dynamic_array + // tests/artifacts/Arc4ABIMethod/contract.py:88 // assert Txn.num_app_args == 4 txn NumAppArgs pushint 4 // 4 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:88-89 + // tests/artifacts/Arc4ABIMethod/contract.py:89-90 // # struct // assert struct1.another_struct.one == 1 dig 3 @@ -348,7 +361,7 @@ complex_sig: bytec_2 // 0x0000000000000001 b== assert - // tests/artifacts/Arc4ABIMethod/contract.py:88-90 + // tests/artifacts/Arc4ABIMethod/contract.py:89-91 // # struct // assert struct1.another_struct.one == 1 // assert struct1.another_struct.two == "2" @@ -361,12 +374,12 @@ complex_sig: uncover 2 dig 2 substring3 - // tests/artifacts/Arc4ABIMethod/contract.py:90 + // tests/artifacts/Arc4ABIMethod/contract.py:91 // assert struct1.another_struct.two == "2" bytec_3 // 0x000132 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:91 + // tests/artifacts/Arc4ABIMethod/contract.py:92 // assert struct1.another_struct_alias.one == 1 dig 6 len @@ -379,7 +392,7 @@ complex_sig: bytec_2 // 0x0000000000000001 b== assert - // tests/artifacts/Arc4ABIMethod/contract.py:91-92 + // tests/artifacts/Arc4ABIMethod/contract.py:92-93 // assert struct1.another_struct_alias.one == 1 // assert struct1.another_struct_alias.two == "2" dup @@ -388,28 +401,28 @@ complex_sig: dig 1 len substring3 - // tests/artifacts/Arc4ABIMethod/contract.py:90 + // tests/artifacts/Arc4ABIMethod/contract.py:91 // assert struct1.another_struct.two == "2" bytec_3 // 0x000132 - // tests/artifacts/Arc4ABIMethod/contract.py:92 + // tests/artifacts/Arc4ABIMethod/contract.py:93 // assert struct1.another_struct_alias.two == "2" == assert - // tests/artifacts/Arc4ABIMethod/contract.py:93 + // tests/artifacts/Arc4ABIMethod/contract.py:94 // assert struct1.three == 3 dig 5 extract 4 16 pushbytes 0x00000000000000000000000000000003 b== assert - // tests/artifacts/Arc4ABIMethod/contract.py:94 + // tests/artifacts/Arc4ABIMethod/contract.py:95 // assert struct1.four == 4 dig 5 extract 20 16 pushbytes 0x00000000000000000000000000000004 b== assert - // tests/artifacts/Arc4ABIMethod/contract.py:96-97 + // tests/artifacts/Arc4ABIMethod/contract.py:97-98 // # txn // assert txn.group_index == Txn.group_index - 1 uncover 4 @@ -419,14 +432,14 @@ complex_sig: - == assert - // tests/artifacts/Arc4ABIMethod/contract.py:99-100 + // tests/artifacts/Arc4ABIMethod/contract.py:100-101 // # acc // assert Txn.application_args(2) == arc4.UInt8(1).bytes # acc array ref txna ApplicationArgs 2 pushbytes 0x01 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:101 + // tests/artifacts/Arc4ABIMethod/contract.py:102 // assert acc.balance == acc.min_balance + 1234 dig 3 acct_params_get AcctBalance @@ -438,7 +451,7 @@ complex_sig: + == assert - // tests/artifacts/Arc4ABIMethod/contract.py:102 + // tests/artifacts/Arc4ABIMethod/contract.py:103 // assert five[0] == 5 uncover 2 extract 2 1 @@ -468,7 +481,7 @@ complex_sig: // tests.artifacts.Arc4ABIMethod.contract.SignaturesContract.echo_resource_by_index[routing]() -> void: echo_resource_by_index: - // tests/artifacts/Arc4ABIMethod/contract.py:106-108 + // tests/artifacts/Arc4ABIMethod/contract.py:107-109 // @arc4.abimethod( // resource_encoding="index", // ) @@ -481,37 +494,37 @@ echo_resource_by_index: txna ApplicationArgs 3 btoi txnas Accounts - // tests/artifacts/Arc4ABIMethod/contract.py:112 + // tests/artifacts/Arc4ABIMethod/contract.py:113 // asset_idx = op.btoi(Txn.application_args(1)) txna ApplicationArgs 1 btoi - // tests/artifacts/Arc4ABIMethod/contract.py:113 + // tests/artifacts/Arc4ABIMethod/contract.py:114 // 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:114 + // tests/artifacts/Arc4ABIMethod/contract.py:115 // app_idx = op.btoi(Txn.application_args(2)) txna ApplicationArgs 2 btoi - // tests/artifacts/Arc4ABIMethod/contract.py:115 + // tests/artifacts/Arc4ABIMethod/contract.py:116 // 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:116 + // tests/artifacts/Arc4ABIMethod/contract.py:117 // acc_idx = op.btoi(Txn.application_args(3)) txna ApplicationArgs 3 btoi - // tests/artifacts/Arc4ABIMethod/contract.py:117 + // tests/artifacts/Arc4ABIMethod/contract.py:118 // 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:106-108 + // tests/artifacts/Arc4ABIMethod/contract.py:107-109 // @arc4.abimethod( // resource_encoding="index", // ) @@ -532,7 +545,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:120-122 + // tests/artifacts/Arc4ABIMethod/contract.py:121-123 // @arc4.abimethod( // resource_encoding="value", // ) @@ -541,35 +554,42 @@ echo_resource_by_value: txna ApplicationArgs 2 btoi txna ApplicationArgs 3 - // tests/artifacts/Arc4ABIMethod/contract.py:126 + // tests/artifacts/Arc4ABIMethod/contract.py:127 + // acc.validate() + dup + len + pushint 32 // 32 + == + assert // invalid number of bytes for arc4.static_array + // tests/artifacts/Arc4ABIMethod/contract.py:128 // asset_id = op.btoi(Txn.application_args(1)) txna ApplicationArgs 1 btoi - // tests/artifacts/Arc4ABIMethod/contract.py:127 + // tests/artifacts/Arc4ABIMethod/contract.py:129 // 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:128 + // tests/artifacts/Arc4ABIMethod/contract.py:130 // app_id = op.btoi(Txn.application_args(2)) txna ApplicationArgs 2 btoi - // tests/artifacts/Arc4ABIMethod/contract.py:129 + // tests/artifacts/Arc4ABIMethod/contract.py:131 // 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:131 + // tests/artifacts/Arc4ABIMethod/contract.py:133 // assert acc.bytes == address, "expected account to be passed by value" dup - // tests/artifacts/Arc4ABIMethod/contract.py:130 + // tests/artifacts/Arc4ABIMethod/contract.py:132 // address = Txn.application_args(3) txna ApplicationArgs 3 - // tests/artifacts/Arc4ABIMethod/contract.py:131 + // tests/artifacts/Arc4ABIMethod/contract.py:133 // assert acc.bytes == address, "expected account to be passed by value" == assert // expected account to be passed by value - // tests/artifacts/Arc4ABIMethod/contract.py:120-122 + // tests/artifacts/Arc4ABIMethod/contract.py:121-123 // @arc4.abimethod( // resource_encoding="value", // ) diff --git a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json index e58afca..1580481 100644 --- a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json +++ b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json @@ -352,64 +352,64 @@ }, { "pc": [ - 336, - 341, - 522, - 527 + 338, + 343, + 535, + 540 ], "errorMessage": "account funded" }, { "pc": [ - 274 + 276 ], "errorMessage": "application exists" }, { "pc": [ - 234 + 236 ], "errorMessage": "asset exists" }, { "pc": [ - 614 + 627 ], "errorMessage": "expected account to be passed by index" }, { "pc": [ - 662 + 681 ], "errorMessage": "expected account to be passed by value" }, { "pc": [ - 270 + 272 ], "errorMessage": "expected app id to match provided app id" }, { "pc": [ - 604 + 617 ], "errorMessage": "expected application to be passed by index" }, { "pc": [ - 656 + 675 ], "errorMessage": "expected application to be passed by value" }, { "pc": [ - 594 + 607 ], "errorMessage": "expected asset to be passed by index" }, { "pc": [ - 648 + 667 ], "errorMessage": "expected asset to be passed by value" }, @@ -427,7 +427,7 @@ }, { "pc": [ - 278 + 280 ], "errorMessage": "expected other app to have same creator" }, @@ -438,16 +438,34 @@ ], "errorMessage": "expected txn to have 0" }, + { + "pc": [ + 380 + ], + "errorMessage": "invalid array length header" + }, + { + "pc": [ + 388 + ], + "errorMessage": "invalid number of bytes for arc4.dynamic_array" + }, + { + "pc": [ + 659 + ], + "errorMessage": "invalid number of bytes for arc4.static_array" + }, { "pc": [ 129, - 284 + 286 ], "errorMessage": "transaction type is appl" }, { "pc": [ - 184 + 186 ], "errorMessage": "transaction type is pay" } @@ -460,19 +478,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgNiAxMjMKICAgIGJ5dGVjYmxvY2sgMHgwMDAwIDB4MTUxZjdjNzUgMHgwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyNQogICAgLy8gY2xhc3MgU2lnbmF0dXJlc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMTMKICAgIHB1c2hieXRlc3MgMHhlMTg5MjJkOCAweDNiMDVjZjE3IDB4MDY1OGRjYzMgMHg1YjY0NDdkZSAweDA2MWY0ZTc3IDB4ZWFhODkxMzkgMHg1MTBlNzJhNCAweGQ2YzJhYzdmIDB4NDgxNDJkNWUgLy8gbWV0aG9kICJzaW5rKHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgImFsaWFzKHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfdHhuKHN0cmluZyxwYXksdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2Fzc2V0KHN0cmluZyxhc3NldCx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfYXBwKHN0cmluZyxhcHBsaWNhdGlvbix1aW50NjQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2FjYyhzdHJpbmcsYWNjb3VudCx1aW50OFtdKXZvaWQiLCBtZXRob2QgImNvbXBsZXhfc2lnKCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCksdHhuLGFjY291bnQsdWludDhbXSkoKHVpbnQ2NCxzdHJpbmcpLCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCkpIiwgbWV0aG9kICJlY2hvX3Jlc291cmNlX2J5X2luZGV4KGFzc2V0LGFwcGxpY2F0aW9uLGFjY291bnQpKHVpbnQ2NCx1aW50NjQsYWRkcmVzcykiLCBtZXRob2QgImVjaG9fcmVzb3VyY2VfYnlfdmFsdWUodWludDY0LHVpbnQ2NCxhZGRyZXNzKSh1aW50NjQsdWludDY0LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc2luayBzaW5rMiB3aXRoX3R4biB3aXRoX2Fzc2V0IHdpdGhfYXBwIHdpdGhfYWNjIGNvbXBsZXhfc2lnIGVjaG9fcmVzb3VyY2VfYnlfaW5kZXggZWNob19yZXNvdXJjZV9ieV92YWx1ZQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjUKICAgIC8vIGNsYXNzIFNpZ25hdHVyZXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzIDB4NGM1YzYxYmEgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOAogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkICE9IDAsICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQiCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozMC0zMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjgKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBhcHBfdHhuLmFwcF9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCB0eG4gdG8gaGF2ZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNAogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IGV4cGVjdGVkIHR4biB0byBoYXZlIDAKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Quc2lua1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpbms6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzkKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LnNpbmsyW3JvdXRpbmddKCkgLT4gdm9pZDoKc2luazI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9ImFsaWFzIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NAogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9ImFsaWFzIikKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC53aXRoX3R4bltyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhfdHhuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0OAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0OQogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBhc3NlcnQgcGF5Lmdyb3VwX2luZGV4ID09IDAKICAgIGR1cAogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgIQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1MQogICAgLy8gYXNzZXJ0IFR4bi5ncm91cF9pbmRleCA9PSAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBhc3NlcnQgcGF5LmFtb3VudCA9PSAxMjMKICAgIGd0eG5zIEFtb3VudAogICAgaW50Y18zIC8vIDEyMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC53aXRoX2Fzc2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aF9hc3NldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTYKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTcKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1OAogICAgLy8gYXNzZXJ0IGFzc2V0LnRvdGFsID09IDEyMwogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VG90YWwKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGludGNfMyAvLyAxMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgVHhuLmFzc2V0cygwKSA9PSBhc3NldAogICAgdHhuYSBBc3NldHMgMAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC53aXRoX2FwcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhfYXBwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2NQogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICB1bmNvdmVyIDMKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2NgogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBhc3NlcnQgYXBwLmlkID09IGFwcF9pZCwgImV4cGVjdGVkIGFwcCBpZCB0byBtYXRjaCBwcm92aWRlZCBhcHAgaWQiCiAgICBkaWcgMQogICAgaXRvYgogICAgYj09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwIGlkIHRvIG1hdGNoIHByb3ZpZGVkIGFwcCBpZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjgKICAgIC8vIGFzc2VydCBhcHAuY3JlYXRvciA9PSBvcC5HbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiZXhwZWN0ZWQgb3RoZXIgYXBwIHRvIGhhdmUgc2FtZSBjcmVhdG9yIgogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3RoZXIgYXBwIHRvIGhhdmUgc2FtZSBjcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2OQogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzAKICAgIC8vIGFzc2VydCBhcHBfdHhuLmFwcHMoMCkgPT0gb3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQKICAgIGR1cAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbnMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzEKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25zKDApID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkCiAgICB0eG5hIEFwcGxpY2F0aW9ucyAwCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBhcHBfdHhuID0gZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbigwKQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBhc3NlcnQgYXBwX3R4bi5hcHBzKDEpID09IGFwcAogICAgaW50Y18wIC8vIDEKICAgIGd0eG5zYXMgQXBwbGljYXRpb25zCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25zKDEpID09IGFwcAogICAgdHhuYSBBcHBsaWNhdGlvbnMgMQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC53aXRoX2FjY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhfYWNjOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzkKICAgIC8vIGFzc2VydCBhY2MuYmFsYW5jZSA9PSBhY2MubWluX2JhbGFuY2UgKyAxMjM0CiAgICBkdXAKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHB1c2hpbnQgMTIzNCAvLyAxMjM0CiAgICArCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MAogICAgLy8gYXNzZXJ0IFR4bi5hY2NvdW50cygwKSA9PSBUeG4uc2VuZGVyCiAgICB0eG5hIEFjY291bnRzIDAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBhc3NlcnQgVHhuLmFjY291bnRzKDEpID09IGFjYwogICAgdHhuYSBBY2NvdW50cyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LmNvbXBsZXhfc2lnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29tcGxleF9zaWc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4NwogICAgLy8gYXNzZXJ0IFR4bi5udW1fYXBwX2FyZ3MgPT0gNAogICAgdHhuIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4OC04OQogICAgLy8gIyBzdHJ1Y3QKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0Lm9uZSA9PSAxCiAgICBkaWcgMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgcHVzaGludCAyIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNQogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4OC05MAogICAgLy8gIyBzdHJ1Y3QKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0Lm9uZSA9PSAxCiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC50d28gPT0gIjIiCiAgICBkdXAKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC50d28gPT0gIjIiCiAgICBieXRlY18zIC8vIDB4MDAwMTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIGRpZyA2CiAgICBsZW4KICAgIGRpZyA3CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MS05MgogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3QudHdvID09ICIyIgogICAgYnl0ZWNfMyAvLyAweDAwMDEzMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTIKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLnR3byA9PSAiMiIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBhc3NlcnQgc3RydWN0MS50aHJlZSA9PSAzCiAgICBkaWcgNQogICAgZXh0cmFjdCA0IDE2CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMwogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5mb3VyID09IDQKICAgIGRpZyA1CiAgICBleHRyYWN0IDIwIDE2CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk2LTk3CiAgICAvLyAjIHR4bgogICAgLy8gYXNzZXJ0IHR4bi5ncm91cF9pbmRleCA9PSBUeG4uZ3JvdXBfaW5kZXggLSAxCiAgICB1bmNvdmVyIDQKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTktMTAwCiAgICAvLyAjIGFjYwogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9hcmdzKDIpID09IGFyYzQuVUludDgoMSkuYnl0ZXMgICMgYWNjIGFycmF5IHJlZgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgcHVzaGJ5dGVzIDB4MDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYXNzZXJ0IGFjYy5iYWxhbmNlID09IGFjYy5taW5fYmFsYW5jZSArIDEyMzQKICAgIGRpZyAzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgdW5jb3ZlciA0CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgcHVzaGludCAxMjM0IC8vIDEyMzQKICAgICsKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IGZpdmVbMF0gPT0gNQogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDIgMQogICAgcHVzaGJ5dGVzIDB4MDUKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuZWNob19yZXNvdXJjZV9ieV9pbmRleFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmVjaG9fcmVzb3VyY2VfYnlfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDYtMTA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTEyCiAgICAvLyBhc3NldF9pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTEzCiAgICAvLyBhc3NlcnQgYXNzZXQgPT0gVHhuLmFzc2V0cyhhc3NldF9pZHgpLCAiZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQXNzZXRzCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExNAogICAgLy8gYXBwX2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTUKICAgIC8vIGFzc2VydCBhcHAgPT0gVHhuLmFwcGxpY2F0aW9ucyhhcHBfaWR4KSwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSBpbmRleCIKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTYKICAgIC8vIGFjY19pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDMpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgYWNjID09IFR4bi5hY2NvdW50cyhhY2NfaWR4KSwgImV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQWNjb3VudHMKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDYtMTA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5lY2hvX3Jlc291cmNlX2J5X3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKZWNob19yZXNvdXJjZV9ieV92YWx1ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyMC0xMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0idmFsdWUiLAogICAgLy8gKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTI2CiAgICAvLyBhc3NldF9pZCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjcKICAgIC8vIGFzc2VydCBhc3NldC5pZCA9PSBhc3NldF9pZCwgImV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTI4CiAgICAvLyBhcHBfaWQgPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDIpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTI5CiAgICAvLyBhc3NlcnQgYXBwLmlkID09IGFwcF9pZCwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMxCiAgICAvLyBhc3NlcnQgYWNjLmJ5dGVzID09IGFkZHJlc3MsICJleHBlY3RlZCBhY2NvdW50IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMwCiAgICAvLyBhZGRyZXNzID0gVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMykKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gYXNzZXJ0IGFjYy5ieXRlcyA9PSBhZGRyZXNzLCAiZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgdmFsdWUiCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjAtMTIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9InZhbHVlIiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgNiAxMjMKICAgIGJ5dGVjYmxvY2sgMHgwMDAwIDB4MTUxZjdjNzUgMHgwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyNQogICAgLy8gY2xhc3MgU2lnbmF0dXJlc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMTMKICAgIHB1c2hieXRlc3MgMHhlMTg5MjJkOCAweDNiMDVjZjE3IDB4MDY1OGRjYzMgMHg1YjY0NDdkZSAweDA2MWY0ZTc3IDB4ZWFhODkxMzkgMHg1MTBlNzJhNCAweGQ2YzJhYzdmIDB4NDgxNDJkNWUgLy8gbWV0aG9kICJzaW5rKHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgImFsaWFzKHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfdHhuKHN0cmluZyxwYXksdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2Fzc2V0KHN0cmluZyxhc3NldCx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfYXBwKHN0cmluZyxhcHBsaWNhdGlvbix1aW50NjQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2FjYyhzdHJpbmcsYWNjb3VudCx1aW50OFtdKXZvaWQiLCBtZXRob2QgImNvbXBsZXhfc2lnKCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCksdHhuLGFjY291bnQsdWludDhbXSkoKHVpbnQ2NCxzdHJpbmcpLCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCkpIiwgbWV0aG9kICJlY2hvX3Jlc291cmNlX2J5X2luZGV4KGFzc2V0LGFwcGxpY2F0aW9uLGFjY291bnQpKHVpbnQ2NCx1aW50NjQsYWRkcmVzcykiLCBtZXRob2QgImVjaG9fcmVzb3VyY2VfYnlfdmFsdWUodWludDY0LHVpbnQ2NCxhZGRyZXNzKSh1aW50NjQsdWludDY0LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc2luayBzaW5rMiB3aXRoX3R4biB3aXRoX2Fzc2V0IHdpdGhfYXBwIHdpdGhfYWNjIGNvbXBsZXhfc2lnIGVjaG9fcmVzb3VyY2VfYnlfaW5kZXggZWNob19yZXNvdXJjZV9ieV92YWx1ZQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjUKICAgIC8vIGNsYXNzIFNpZ25hdHVyZXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzIDB4NGM1YzYxYmEgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOAogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkICE9IDAsICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQiCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozMC0zMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjgKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBhcHBfdHhuLmFwcF9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCB0eG4gdG8gaGF2ZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNAogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rW3JvdXRpbmddKCkgLT4gdm9pZDoKc2luazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QodmFsaWRhdGVfZW5jb2Rpbmc9InVuc2FmZV9kaXNhYmxlZCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzkKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh2YWxpZGF0ZV9lbmNvZGluZz0idW5zYWZlX2Rpc2FibGVkIikKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpbmsyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJhbGlhcyIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0MwogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJhbGlhcyIpCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF90eG5bcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX3R4bjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDgKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDkKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1MAogICAgLy8gYXNzZXJ0IHBheS5ncm91cF9pbmRleCA9PSAwCiAgICBkdXAKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTEKICAgIC8vIGFzc2VydCBUeG4uZ3JvdXBfaW5kZXggPT0gMQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1MgogICAgLy8gYXNzZXJ0IHBheS5hbW91bnQgPT0gMTIzCiAgICBndHhucyBBbW91bnQKICAgIGludGNfMyAvLyAxMjMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hc3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhfYXNzZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTgKICAgIC8vIGFzc2VydCBhc3NldC50b3RhbCA9PSAxMjMKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1OQogICAgLy8gYXNzZXJ0IFR4bi5hc3NldHMoMCkgPT0gYXNzZXQKICAgIHR4bmEgQXNzZXRzIDAKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hcHBbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FwcDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjUKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAzCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjYKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2NwogICAgLy8gYXNzZXJ0IGFwcC5pZCA9PSBhcHBfaWQsICJleHBlY3RlZCBhcHAgaWQgdG8gbWF0Y2ggcHJvdmlkZWQgYXBwIGlkIgogICAgZGlnIDEKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBpZCB0byBtYXRjaCBwcm92aWRlZCBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBhc3NlcnQgYXBwLmNyZWF0b3IgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvciIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjkKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBhc3NlcnQgYXBwX3R4bi5hcHBzKDApID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkCiAgICBkdXAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25zCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygwKSA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgdHhuYSBBcHBsaWNhdGlvbnMgMAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2OQogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MgogICAgLy8gYXNzZXJ0IGFwcF90eG4uYXBwcygxKSA9PSBhcHAKICAgIGludGNfMCAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9ucwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjczCiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygxKSA9PSBhcHAKICAgIHR4bmEgQXBwbGljYXRpb25zIDEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hY2Nbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FjYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3NwogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3OAogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBhc3NlcnQgYWNjLmJhbGFuY2UgPT0gYWNjLm1pbl9iYWxhbmNlICsgMTIzNAogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBwdXNoaW50IDEyMzQgLy8gMTIzNAogICAgKwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODAKICAgIC8vIGFzc2VydCBUeG4uYWNjb3VudHMoMCkgPT0gVHhuLnNlbmRlcgogICAgdHhuYSBBY2NvdW50cyAwCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IFR4bi5hY2NvdW50cygxKSA9PSBhY2MKICAgIHR4bmEgQWNjb3VudHMgMQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5jb21wbGV4X3NpZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbXBsZXhfc2lnOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODcKICAgIC8vIGZpdmUudmFsaWRhdGUoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODgKICAgIC8vIGFzc2VydCBUeG4ubnVtX2FwcF9hcmdzID09IDQKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODktOTAKICAgIC8vICMgc3RydWN0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC5vbmUgPT0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDUKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODktOTEKICAgIC8vICMgc3RydWN0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC5vbmUgPT0gMQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3QudHdvID09ICIyIgogICAgZHVwCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3QudHdvID09ICIyIgogICAgYnl0ZWNfMyAvLyAweDAwMDEzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTIKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLm9uZSA9PSAxCiAgICBkaWcgNgogICAgbGVuCiAgICBkaWcgNwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTItOTMKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLm9uZSA9PSAxCiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdF9hbGlhcy50d28gPT0gIjIiCiAgICBkdXAKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGJ5dGVjXzMgLy8gMHgwMDAxMzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdF9hbGlhcy50d28gPT0gIjIiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NAogICAgLy8gYXNzZXJ0IHN0cnVjdDEudGhyZWUgPT0gMwogICAgZGlnIDUKICAgIGV4dHJhY3QgNCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuZm91ciA9PSA0CiAgICBkaWcgNQogICAgZXh0cmFjdCAyMCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5Ny05OAogICAgLy8gIyB0eG4KICAgIC8vIGFzc2VydCB0eG4uZ3JvdXBfaW5kZXggPT0gVHhuLmdyb3VwX2luZGV4IC0gMQogICAgdW5jb3ZlciA0CiAgICBndHhucyBHcm91cEluZGV4CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwMC0xMDEKICAgIC8vICMgYWNjCiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikgPT0gYXJjNC5VSW50OCgxKS5ieXRlcyAgIyBhY2MgYXJyYXkgcmVmCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTAyCiAgICAvLyBhc3NlcnQgYWNjLmJhbGFuY2UgPT0gYWNjLm1pbl9iYWxhbmNlICsgMTIzNAogICAgZGlnIDMKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICB1bmNvdmVyIDQKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBwdXNoaW50IDEyMzQgLy8gMTIzNAogICAgKwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgZml2ZVswXSA9PSA1CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAxCiAgICBwdXNoYnl0ZXMgMHgwNQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5lY2hvX3Jlc291cmNlX2J5X2luZGV4W3JvdXRpbmddKCkgLT4gdm9pZDoKZWNob19yZXNvdXJjZV9ieV9pbmRleDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwNy0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiLAogICAgLy8gKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTMKICAgIC8vIGFzc2V0X2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTQKICAgIC8vIGFzc2VydCBhc3NldCA9PSBUeG4uYXNzZXRzKGFzc2V0X2lkeCksICJleHBlY3RlZCBhc3NldCB0byBiZSBwYXNzZWQgYnkgaW5kZXgiCiAgICB0eG5hcyBBc3NldHMKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSBpbmRleAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE1CiAgICAvLyBhcHBfaWR4ID0gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygyKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExNgogICAgLy8gYXNzZXJ0IGFwcCA9PSBUeG4uYXBwbGljYXRpb25zKGFwcF9pZHgpLCAiZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcHBsaWNhdGlvbiB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYWNjX2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMykpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBhY2MgPT0gVHhuLmFjY291bnRzKGFjY19pZHgpLCAiZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgaW5kZXgiCiAgICB0eG5hcyBBY2NvdW50cwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwNy0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LmVjaG9fcmVzb3VyY2VfYnlfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgplY2hvX3Jlc291cmNlX2J5X3ZhbHVlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTIxLTEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIHJlc291cmNlX2VuY29kaW5nPSJ2YWx1ZSIsCiAgICAvLyApCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjcKICAgIC8vIGFjYy52YWxpZGF0ZSgpCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjgKICAgIC8vIGFzc2V0X2lkID0gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gYXNzZXJ0IGFzc2V0LmlkID09IGFzc2V0X2lkLCAiZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIgogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzAKICAgIC8vIGFwcF9pZCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzEKICAgIC8vIGFzc2VydCBhcHAuaWQgPT0gYXBwX2lkLCAiZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCBhY2MuYnl0ZXMgPT0gYWRkcmVzcywgImV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIgogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzIKICAgIC8vIGFkZHJlc3MgPSBUeG4uYXBwbGljYXRpb25fYXJncygzKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMzCiAgICAvLyBhc3NlcnQgYWNjLmJ5dGVzID09IGFkZHJlc3MsICJleHBlY3RlZCBhY2NvdW50IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgdmFsdWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyMS0xMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0idmFsdWUiLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyAEAQAGeyYEAgAABBUffHUIAAAAAAAAAAEDAAEyMRkURDEYQQBHggkE4Yki2AQ7Bc8XBAZY3MMEW2RH3gQGH053BOqokTkEUQ5ypATWwqx/BEgULV42GgCOCQAnADMAPwBmAIYAzAD7AcoCCQCABExcYbo2GgCOAQABACM4ECQSRDIIRDIKMgMTRCM4GBREMRgUQzYaAjYaASgTRCgTQzYaAjYaASgTRCgTQzYaATEWIglJOBAiEkQ2GgJPAigTRCgTREk4FhREMRYiEkQ4CCUSQzYaATYaAhfAMDYaA08CKBNEKBNESXEARCUSRDYwABJDNhoBNhoCF8AyNhoDNhoETwMoE0QoE0RLARaoRElyB0QyCRJEIzgQJBJEI0nCMjIIEkQ2MgAyCBJEIyLCMksBEkQ2MgESQzYaATYaAhfAHDYaA08CKBNEKBNESXMAREsBcwFEgdIJCBJENhwAMQASRDYcARJDNhoBMRYiCTYaAhfAHDYaAzEbgQQSREsDI1lLBIECWUsFTwJLAlJJVwAIKqhESYEIWUsBFUsCTwJLAlIrEkRLBhVLB08ETwJSSVcACCqoREmBCFlLARVSKxJESwVXBBCAEAAAAAAAAAAAAAAAAAAAAAOoREsFVxQQgBAAAAAAAAAAAAAAAAAAAAAEqERPBDgWMRYiCRJENhoCgAEBEkRLA3MARE8EcwFEgdIJCBJETwJXAgGAAQWoRIEECBZXBgKAAgAETFBMUExQKUxQsCJDNhoBF8AwNhoCF8AyNhoDF8AcNhoBF8AwSwMSRDYaAhfAMksCEkQ2GgMXwBxLARJETwIWTwIWUExQKUxQsCJDNhoBFzYaAhc2GgM2GgEXSwMSRDYaAhdLAhJESTYaAxJETwIWTwIWUExQKUxQsCJD", + "approval": "CyAEAQAGeyYEAgAABBUffHUIAAAAAAAAAAEDAAEyMRkURDEYQQBHggkE4Yki2AQ7Bc8XBAZY3MMEW2RH3gQGH053BOqokTkEUQ5ypATWwqx/BEgULV42GgCOCQApADUAQQBoAIgAzgD9AdcCFgCABExcYbo2GgCOAQABACM4ECQSRDIIRDIKMgMTRCM4GBREMRgURCJDNhoCNhoBKBNEKBNDNhoCNhoBKBNEKBNDNhoBMRYiCUk4ECISRDYaAk8CKBNEKBNESTgWFEQxFiISRDgIJRJDNhoBNhoCF8AwNhoDTwIoE0QoE0RJcQBEJRJENjAAEkM2GgE2GgIXwDI2GgM2GgRPAygTRCgTREsBFqhESXIHRDIJEkQjOBAkEkQjScIyMggSRDYyADIIEkQjIsIySwESRDYyARJDNhoBNhoCF8AcNhoDTwIoE0QoE0RJcwBESwFzAUSB0gkIEkQ2HAAxABJENhwBEkM2GgExFiIJNhoCF8AcNhoDSSNZgQIISwEVEkQxG4EEEkRLAyNZSwSBAllLBU8CSwJSSVcACCqoREmBCFlLARVLAk8CSwJSKxJESwYVSwdPBE8CUklXAAgqqERJgQhZSwEVUisSREsFVwQQgBAAAAAAAAAAAAAAAAAAAAADqERLBVcUEIAQAAAAAAAAAAAAAAAAAAAABKhETwQ4FjEWIgkSRDYaAoABARJESwNzAERPBHMBRIHSCQgSRE8CVwIBgAEFqESBBAgWVwYCgAIABExQTFBMUClMULAiQzYaARfAMDYaAhfAMjYaAxfAHDYaARfAMEsDEkQ2GgIXwDJLAhJENhoDF8AcSwESRE8CFk8CFlBMUClMULAiQzYaARc2GgIXNhoDSRWBIBJENhoBF0sDEkQ2GgIXSwISREk2GgMSRE8CFk8CFlBMUClMULAiQw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal b/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal index de48033..bd404c1 100644 --- a/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal +++ b/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal @@ -28,7 +28,9 @@ main___algopy_default_create@5: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + pushint 1 // 1 + return // tests.artifacts.Arc4InnerTxns.contract.Arc4InnerTxnsContract.opt_in_dummy_asset[routing]() -> void: diff --git a/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json b/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json index b69022a..769231f 100644 --- a/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json +++ b/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json @@ -81,19 +81,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFyYzRJbm5lclR4bnNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4YWIzOWM1NWEgLy8gbWV0aG9kICJvcHRfaW5fZHVtbXlfYXNzZXQodWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9kdW1teV9hc3NldF9yb3V0ZUAzCiAgICBlcnIKCm1haW5fb3B0X2luX2R1bW15X2Fzc2V0X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBvcHRfaW5fZHVtbXlfYXNzZXQKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0SW5uZXJUeG5zLmNvbnRyYWN0LkFyYzRJbm5lclR4bnNDb250cmFjdC5vcHRfaW5fZHVtbXlfYXNzZXRbcm91dGluZ10oKSAtPiB2b2lkOgpvcHRfaW5fZHVtbXlfYXNzZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjctMTEKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6OQogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTgKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6Ny0xMQogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFyYzRJbm5lclR4bnNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4YWIzOWM1NWEgLy8gbWV0aG9kICJvcHRfaW5fZHVtbXlfYXNzZXQodWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9kdW1teV9hc3NldF9yb3V0ZUAzCiAgICBlcnIKCm1haW5fb3B0X2luX2R1bW15X2Fzc2V0X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBvcHRfaW5fZHVtbXlfYXNzZXQKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRJbm5lclR4bnMuY29udHJhY3QuQXJjNElubmVyVHhuc0NvbnRyYWN0Lm9wdF9pbl9kdW1teV9hc3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbl9kdW1teV9hc3NldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6Ny0xMQogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo5CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjctOAogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCAwIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CzEbQQAYgASrOcVaNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgEXsTIKshSyEYEEshCBALIBs4EBQw==", + "approval": "CzEbQQAYgASrOcVaNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUM2GgEXsTIKshSyEYEEshCBALIBs4EBQw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal b/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal index 6e07573..21d903e 100644 --- a/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal +++ b/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal @@ -25,7 +25,9 @@ main___algopy_default_create@57: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.Arc4PrimitiveOps.contract.Arc4PrimitiveOpsContract.verify_uintn_uintn_eq[routing]() -> void: diff --git a/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json b/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json index 56836b1..afabcf8 100644 --- a/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json +++ b/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json @@ -1374,80 +1374,80 @@ }, { "pc": [ - 1579, - 1599, - 1788, - 1808, - 1933, - 1982 + 1581, + 1601, + 1790, + 1810, + 1935, + 1984 ], "errorMessage": "application log value is not the result of an ABI return" }, { "pc": [ - 1855 + 1857 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 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 + 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 ], "errorMessage": "overflow" } @@ -1460,19 +1460,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggNjQgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIEFyYzRQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANTcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4OTZmMTQxMTYgMHhlZDY2NjA5NiAweDJjYTAzNTJiIDB4ODU5MDdkNDAgMHgyY2JlYzQ1YiAweDA3NjY2ZmQ5IDB4MzcwYmFiZDMgMHgyYjZiM2VmMCAweDMzOWRhOTdjIDB4Nzg5OGVkOTcgMHgxZjEzMGNlYyAweGM3NDg2NjRlIDB4N2E0NjBjYjEgMHhkY2FiMWYwMSAweDk3ZDkwNjRkIDB4Y2UwNmMyYTAgMHhkY2RiY2VlMCAweDc3YTRiNjhkIDB4NGY1NDA2MjYgMHgwOTVhZWQ0MSAweGUzYjdlOTE4IDB4NTUzMzcwMDggMHg5YmIxY2Q2NiAweDgxNDg0ZDlkIDB4OWEwM2RmMTAgMHhkM2YwZTQ0YiAweDk4MmRiMjMzIDB4YWZmYmRmMGUgMHgyODhhZjc2ZSAweDhiZDg0YTA0IDB4MzAyYjhhMGEgMHgzMzdhZTIwYiAweDZlMjU5MjcwIDB4NzllMzVmNzcgMHgwZjE1NzRmZSAweGIyY2IxM2JlIDB4ZDA1OWVlYTcgMHg0Y2M0YzE1NyAweDNkMTdhYzZlIDB4ZjdmM2Q1ZmMgMHhmOGM4ZjhkNSAweDQzZjcxNjJhIDB4NDJlMDkwNzUgMHhkOTU2ZjU3NSAweDZjMDE2MGRmIDB4YTg5MDE1MGIgMHgwYjJmNGMzZiAweDlkYjlkMzI3IDB4ZTRkOTUwYTEgMHhiNjA1ZTgwYyAvLyBtZXRob2QgInZlcmlmeV91aW50bl91aW50bl9lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl91aW50bl9lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9iaWd1aW50bl9lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl91aW50bl9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl91aW50bl9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9iaWd1aW50bl9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl91aW50bl9sdChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl91aW50bl9sdChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9iaWd1aW50bl9sdChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sdChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl91aW50bl9sZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl91aW50bl9sZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9iaWd1aW50bl9sZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl91aW50bl9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl91aW50bl9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9iaWd1aW50bl9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl91aW50bl9nZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl91aW50bl9nZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9iaWd1aW50bl9nZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9nZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9pbml0KGJ5dGVbXSl1aW50MzIiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9pbml0KGJ5dGVbXSl1aW50MjU2IiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fZnJvbV9ieXRlcyhieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlcyhieXRlW10pdWludDI1NiIsIG1ldGhvZCAidmVyaWZ5X3VpbnRuX2Zyb21fbG9nKGJ5dGVbXSl1aW50MzIiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZyhieXRlW10pdWludDI1NiIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2FzX3VpbnQ2NChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYXNfYmlndWludChieXRlW10pdWludDUxMiIsIG1ldGhvZCAidmVyaWZ5X3VpbnRuNjRfYXNfdWludDY0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQoYnl0ZVtdKXVpbnQ1MTIiLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fYnl0ZXModWZpeGVkMzJ4OClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1Zml4ZWRueG1fYnl0ZXModWZpeGVkMjU2eDE2KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3VmaXhlZG54bV9mcm9tX2J5dGVzKGJ5dGVbXSl1Zml4ZWQzMng4IiwgbWV0aG9kICJ2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fYnl0ZXMoYnl0ZVtdKXVmaXhlZDI1NngxNiIsIG1ldGhvZCAidmVyaWZ5X3VmaXhlZG54bV9mcm9tX2xvZyhieXRlW10pdWZpeGVkMzJ4OCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2xvZyhieXRlW10pdWZpeGVkMjU2eDE2IiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2luaXQoc3RyaW5nKXN0cmluZyIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19hZGQoc3RyaW5nLHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfZXEoc3RyaW5nLHN0cmluZylib29sIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2J5dGVzKHN0cmluZylieXRlW10iLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfZnJvbV9ieXRlcyhieXRlW10pc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2Zyb21fbG9nKGJ5dGVbXSlzdHJpbmciLCBtZXRob2QgInZlcmlmeV9ib29sX2J5dGVzKGJvb2wpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYm9vbF9mcm9tX2J5dGVzKGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYm9vbF9mcm9tX2xvZyhieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2VtaXQoc3RyaW5nLHVpbnQ1MTIsdWludDY0LGJ5dGVbXSx1aW50NjQsYm9vbCxieXRlW10sc3RyaW5nLHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJvb2wsYnl0ZVtdLGJ5dGVbXSxieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV91aW50bl91aW50bl9lcSB2ZXJpZnlfYmlndWludG5fdWludG5fZXEgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2VxIHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcSB2ZXJpZnlfdWludG5fdWludG5fbmUgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lIHZlcmlmeV91aW50bl9iaWd1aW50bl9uZSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fbmUgdmVyaWZ5X3VpbnRuX3VpbnRuX2x0IHZlcmlmeV9iaWd1aW50bl91aW50bl9sdCB2ZXJpZnlfdWludG5fYmlndWludG5fbHQgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX2x0IHZlcmlmeV91aW50bl91aW50bl9sZSB2ZXJpZnlfYmlndWludG5fdWludG5fbGUgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2xlIHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sZSB2ZXJpZnlfdWludG5fdWludG5fZ3QgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0IHZlcmlmeV91aW50bl9iaWd1aW50bl9ndCB2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3QgdmVyaWZ5X3VpbnRuX3VpbnRuX2dlIHZlcmlmeV9iaWd1aW50bl91aW50bl9nZSB2ZXJpZnlfdWludG5fYmlndWludG5fZ2UgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX2dlIHZlcmlmeV91aW50bl9pbml0IHZlcmlmeV9iaWd1aW50bl9pbml0IHZlcmlmeV91aW50bl9mcm9tX2J5dGVzIHZlcmlmeV9iaWd1aW50bl9mcm9tX2J5dGVzIHZlcmlmeV91aW50bl9mcm9tX2xvZyB2ZXJpZnlfYmlndWludG5fZnJvbV9sb2cgdmVyaWZ5X2JpZ3VpbnRuX2FzX3VpbnQ2NCB2ZXJpZnlfYmlndWludG5fYXNfYmlndWludCB2ZXJpZnlfdWludG42NF9hc191aW50NjQgdmVyaWZ5X3VpbnRuNjRfYXNfYmlndWludCB2ZXJpZnlfdWZpeGVkbnhtX2J5dGVzIHZlcmlmeV9iaWd1Zml4ZWRueG1fYnl0ZXMgdmVyaWZ5X3VmaXhlZG54bV9mcm9tX2J5dGVzIHZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlcyB2ZXJpZnlfdWZpeGVkbnhtX2Zyb21fbG9nIHZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2cgdmVyaWZ5X3N0cmluZ19pbml0IHZlcmlmeV9zdHJpbmdfYWRkIHZlcmlmeV9zdHJpbmdfZXEgdmVyaWZ5X3N0cmluZ19ieXRlcyB2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXMgdmVyaWZ5X3N0cmluZ19mcm9tX2xvZyB2ZXJpZnlfYm9vbF9ieXRlcyB2ZXJpZnlfYm9vbF9mcm9tX2J5dGVzIHZlcmlmeV9ib29sX2Zyb21fbG9nIHZlcmlmeV9lbWl0CiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANTc6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl91aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl91aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDwgYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPCBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPCBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8PSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPD0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPiBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA+IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9ndDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSA+IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID4gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU0CiAgICAvLyByZXR1cm4gYXJjNC5VSW50MzIoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDQgLy8gNAogICAgYnplcm8KICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50MjU2KGFfYmlndWludCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9mcm9tX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fZnJvbV9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQzMi5mcm9tX2xvZyhhKQogICAgZHVwCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgZXh0cmFjdCAyIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBsb2cgdmFsdWUgaXMgbm90IHRoZSByZXN1bHQgb2YgYW4gQUJJIHJldHVybgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fZnJvbV9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYuZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2FzX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9hc191aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTgwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50MjU2KGFfYmlndWludCkuYXNfdWludDY0KCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBiemVybwogICAgYnwKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLQogICAgaW50Y18xIC8vIDgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGV4dHJhY3QzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9hc19iaWd1aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50MjU2KGFfYmlndWludCkuYXNfYmlndWludCgpCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCAzMiAvLyAzMgogICAgYnplcm8KICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICBifAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG42NF9hc191aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG42NF9hc191aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTkwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KS5hc191aW50NjQoKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG42NF9hc19iaWd1aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkuYXNfYmlndWludCgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIGJ8CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWZpeGVkbnhtX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VmaXhlZG54bV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWZpeGVkbnhtX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWZpeGVkbnhtX2Zyb21fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWZpeGVkbnhtX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VmaXhlZG54bV9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gcmV0dXJuIGFyYzQuVUZpeGVkTnhNW3R5cGluZy5MaXRlcmFsWzMyXSwgdHlwaW5nLkxpdGVyYWxbOF1dLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjMxCiAgICAvLyByZXR1cm4gYXJjNC5CaWdVRml4ZWROeE1bdHlwaW5nLkxpdGVyYWxbMjU2XSwgdHlwaW5nLkxpdGVyYWxbMTZdXS5mcm9tX2xvZyhhKQogICAgZHVwCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgZXh0cmFjdCAyIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBsb2cgdmFsdWUgaXMgbm90IHRoZSByZXN1bHQgb2YgYW4gQUJJIHJldHVybgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcoU3RyaW5nKCJIZWxsbywgIikgKyBhKQogICAgcHVzaGJ5dGVzICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDAKICAgIC8vIHJlc3VsdCA9IGEgKyBiCiAgICBleHRyYWN0IDIgMAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gcmV0dXJuIGEgPT0gYgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19mcm9tX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19mcm9tX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTgKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZy5mcm9tX2xvZyhhKQogICAgZHVwCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgZXh0cmFjdCAyIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBsb2cgdmFsdWUgaXMgbm90IHRoZSByZXN1bHQgb2YgYW4gQUJJIHJldHVybgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYm9vbF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ib29sX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2Jvb2xfZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ib29sX2Zyb21fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYm9vbF9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ib29sX2Zyb21fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcwCiAgICAvLyByZXR1cm4gYXJjNC5Cb29sLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9lbWl0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VtaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTQKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTYKICAgIC8vIGFyYzQuZW1pdChTd2FwcGVkQXJjNChtLCBuLCBvLCBwLCBxLCBhcmM0X3IsIGFyYzRfcywgYXJjNF90KSkKICAgIGRpZyA3CiAgICBkaWcgNwogICAgY29uY2F0CiAgICBkaWcgNgogICAgY29uY2F0CiAgICBkaWcgNQogICAgY29uY2F0CiAgICBkaWcgNAogICAgY29uY2F0CiAgICBkaWcgMwogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDU0CiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBsZW4KICAgIHB1c2hpbnQgODQgLy8gODQKICAgIGRpZyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDY2YmIwMzMzIC8vIG1ldGhvZCAiU3dhcHBlZEFyYzQodWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTctMzE1CiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgIlN3YXBwZWQiLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBjLAogICAgLy8gICAgIGQuY29weSgpLAogICAgLy8gICAgIGUsCiAgICAvLyAgICAgZiwKICAgIC8vICAgICBnLmNvcHkoKSwKICAgIC8vICAgICBoLAogICAgLy8gICAgIG0sCiAgICAvLyAgICAgbiwKICAgIC8vICAgICBvLAogICAgLy8gICAgIHAsCiAgICAvLyAgICAgcSwKICAgIC8vICAgICBhcmM0X3IuY29weSgpLAogICAgLy8gICAgIGFyYzRfcy5jb3B5KCksCiAgICAvLyAgICAgYXJjNF90LAogICAgLy8gKQogICAgZGlnIDE2CiAgICBsZW4KICAgIHB1c2hpbnQgMTczIC8vIDE3MwogICAgKwogICAgcHVzaGJ5dGVzIDB4MDBhZAogICAgdW5jb3ZlciAxNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBkaWcgMTUKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyAxMgogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGVjMzMxOWJiIC8vIG1ldGhvZCAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxNi0zMzQKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGMsCiAgICAvLyAgICAgZC5jb3B5KCksCiAgICAvLyAgICAgZSwKICAgIC8vICAgICBmLAogICAgLy8gICAgIGcuY29weSgpLAogICAgLy8gICAgIGgsCiAgICAvLyAgICAgbSwKICAgIC8vICAgICBuLAogICAgLy8gICAgIG8sCiAgICAvLyAgICAgcCwKICAgIC8vICAgICBxLAogICAgLy8gICAgIGFyYzRfci5jb3B5KCksCiAgICAvLyAgICAgYXJjNF9zLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3QsCiAgICAvLyApCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", + "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" }, "byteCode": { - "approval": "CyAEAQhAACYCBBUffHUBADEbQQFtMRkURDEYRIIyBJbxQRYE7WZglgQsoDUrBIWQfUAELL7EWwQHZm/ZBDcLq9MEK2s+8AQznal8BHiY7ZcEHxMM7ATHSGZOBHpGDLEE3KsfAQSX2QZNBM4GwqAE3NvO4AR3pLaNBE9UBiYECVrtQQTjt+kYBFUzcAgEm7HNZgSBSE2dBJoD3xAE0/DkSwSYLbIzBK/73w4EKIr3bgSL2EoEBDArigoEM3riCwRuJZJwBHnjX3cEDxV0/gSyyxO+BNBZ7qcETMTBVwQ9F6xuBPfz1fwE+Mj41QRD9xYqBELgkHUE2Vb1dQRsAWDfBKiQFQsECy9MPwSdudMnBOTZUKEEtgXoDDYaAI4yAAkANwBlAJMAwQDvAR0BSwF5AacB1QIDAjECXwKNArsC6QMXA0UDcwOhA88D/QQrBFkEbwSFBJEEnQSxBMUE5gUEBRgFNAVFBVYFYgVuBYIFlgW1BdAF4gXzBf8GEwYkBjAGRAAxGRQxGBQQQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrqCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6gpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6kpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqupKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqukKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrpiklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6YpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6UpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqulKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6cpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqunKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpyklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6cpJU8CVChMULAiQzYaAVcCAEkVgQQORIEEr6soTFCwIkM2GgFXAgBJFYEgDkSBIK+rKExQsCJDNhoBVwIAKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAVcCAEkVgSAORIEgr6tJkyQOREkVIwkjWChMULAiQzYaAVcCAEkVgSAORIEgr6tJFSQORCSvqyhMULAiQzYaAVcCAEkVIw5EI6+rKExQsCJDNhoBVwIASRUjDkQjr6tJFSQORCSvqyhMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBSRUWVwYCTFAoTFCwIkM2GgFXAgAoTFCwIkM2GgFXAgAoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBVwIAgAdIZWxsbywgTFBJFRZXBgJMUChMULAiQzYaATYaAlcCAFBJVwIAFRZXBgJcAChMULAiQzYaATYaAhIpJU8CVChMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJFRZXBgJMUChMULAiQzYaAVcCAChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBNhoCNhoDNhoENhoFNhoGNhoHNhoINhoJNhoKNhoLNhoMNhoNNhoOVwIANhoPSSVZSwGBAllSVwIANhoPSYECWUsBFVJXAgBLB0sHUEsGUEsFUEsEUEsDUIACAFRQSwIVgVRLAQgWVwYCTwJMUEsDUEsCUIAEZrsDM0xQsEsQFYGtAQiAAgCtTxFQTxBQSwEWVwYCUEsPFU8CCExPDlBPDVBLARZXBgJQSwwVTwIISRZXBgJPAkxQSwsVTwIITE8KUE8JUE8IUE8HUE8GUE8FUEsBFlcGAlBMTwIIFlcGAlBPBlBPBVBPBFBPA1BPAlBMUIAE7DMZu0xQSbCwIkM=", + "approval": "CyAEAQhAACYCBBUffHUBADEbQQFtMRkURDEYRIIyBJbxQRYE7WZglgQsoDUrBIWQfUAELL7EWwQHZm/ZBDcLq9MEK2s+8AQznal8BHiY7ZcEHxMM7ATHSGZOBHpGDLEE3KsfAQSX2QZNBM4GwqAE3NvO4AR3pLaNBE9UBiYECVrtQQTjt+kYBFUzcAgEm7HNZgSBSE2dBJoD3xAE0/DkSwSYLbIzBK/73w4EKIr3bgSL2EoEBDArigoEM3riCwRuJZJwBHnjX3cEDxV0/gSyyxO+BNBZ7qcETMTBVwQ9F6xuBPfz1fwE+Mj41QRD9xYqBELgkHUE2Vb1dQRsAWDfBKiQFQsECy9MPwSdudMnBOTZUKEEtgXoDDYaAI4yAAsAOQBnAJUAwwDxAR8BTQF7AakB1wIFAjMCYQKPAr0C6wMZA0cDdQOjA9ED/wQtBFsEcQSHBJMEnwSzBMcE6AUGBRoFNgVHBVgFZAVwBYQFmAW3BdIF5AX1BgEGFQYmBjIGRgAxGRQxGBQQRCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6gpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrqCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6gpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAqupKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6kpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAqupKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrpCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqukKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrpCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6YpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpiklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6YpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAqulKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6UpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAqulKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrpyklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6cpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqunKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrpyklTwJUKExQsCJDNhoBVwIASRWBBA5EgQSvqyhMULAiQzYaAVcCAEkVgSAORIEgr6soTFCwIkM2GgFXAgAoTFCwIkM2GgFXAgAoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBVwIASRWBIA5EgSCvq0mTJA5ESRUjCSNYKExQsCJDNhoBVwIASRWBIA5EgSCvq0kVJA5EJK+rKExQsCJDNhoBVwIASRUjDkQjr6soTFCwIkM2GgFXAgBJFSMORCOvq0kVJA5EJK+rKExQsCJDNhoBSRUWVwYCTFAoTFCwIkM2GgFJFRZXBgJMUChMULAiQzYaAVcCAChMULAiQzYaAVcCAChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFXAgCAB0hlbGxvLCBMUEkVFlcGAkxQKExQsCJDNhoBNhoCVwIAUElXAgAVFlcGAlwAKExQsCJDNhoBNhoCEiklTwJUKExQsCJDNhoBSRUWVwYCTFAoTFCwIkM2GgFXAgAoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgE2GgI2GgM2GgQ2GgU2GgY2Ggc2Ggg2Ggk2Ggo2Ggs2Ggw2Gg02Gg5XAgA2Gg9JJVlLAYECWVJXAgA2Gg9JgQJZSwEVUlcCAEsHSwdQSwZQSwVQSwRQSwNQgAIAVFBLAhWBVEsBCBZXBgJPAkxQSwNQSwJQgARmuwMzTFCwSxAVga0BCIACAK1PEVBPEFBLARZXBgJQSw8VTwIITE8OUE8NUEsBFlcGAlBLDBVPAghJFlcGAk8CTFBLCxVPAghMTwpQTwlQTwhQTwdQTwZQTwVQSwEWVwYCUExPAggWVwYCUE8GUE8FUE8EUE8DUE8CUExQgATsMxm7TFBJsLAiQw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [ diff --git a/tests/artifacts/Arrays/data/Contract.approval.teal b/tests/artifacts/Arrays/data/Contract.approval.teal index 8b5d9ea..0a6a936 100644 --- a/tests/artifacts/Arrays/data/Contract.approval.teal +++ b/tests/artifacts/Arrays/data/Contract.approval.teal @@ -33,7 +33,9 @@ main___algopy_default_create@19: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_1 // 1 + return // tests.artifacts.Arrays.uint64.quicksort_window(arr: uint64, window_left: uint64, window_right: uint64) -> void: @@ -930,9 +932,11 @@ test_array_copy_and_extend_after_for@5: pushint 48 // 48 extract_uint64 ! + assert // expected 4 // tests/artifacts/Arrays/uint64.py:84 // @arc4.abimethod() - return // on error: expected 4 + intc_1 // 1 + return // tests.artifacts.Arrays.uint64.Contract.test_array_evaluation_order[routing]() -> void: @@ -1401,7 +1405,7 @@ test_iteration_after_for@21: // assert combined_arr.length == 10 dup intc_2 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header pushint 10 // 10 == assert diff --git a/tests/artifacts/Arrays/data/Contract.arc56.json b/tests/artifacts/Arrays/data/Contract.arc56.json index 4ae1761..f7431d8 100644 --- a/tests/artifacts/Arrays/data/Contract.arc56.json +++ b/tests/artifacts/Arrays/data/Contract.arc56.json @@ -250,97 +250,103 @@ }, { "pc": [ - 880 + 882 ], "errorMessage": "array is expected length" }, { "pc": [ - 1297, - 1376, - 1590 + 1301, + 1380, + 1594 ], "errorMessage": "array is not sorted" }, { "pc": [ - 958, - 988, - 996, - 1003, - 1008 + 960, + 990, + 998, + 1005, + 1010 ], "errorMessage": "expected 4" }, { "pc": [ - 936 + 938 ], "errorMessage": "expected 5" }, { "pc": [ - 1544 + 1548 ], "errorMessage": "expected array of length 32" }, { "pc": [ - 1268 + 1272 ], "errorMessage": "expected array of length 5" }, { "pc": [ - 1339 + 1343 ], "errorMessage": "incorrect array value" }, { "pc": [ - 339, - 348, - 351, - 354, - 738, - 1102, - 1119, - 1175, - 1625, - 1644 + 341, + 350, + 353, + 356, + 740, + 1106, + 1123, + 1179, + 1629, + 1648 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 441, - 490, - 514, - 639, - 701, - 726, - 730, - 800, - 827, - 831, - 835, - 861, - 884, - 901, - 916, - 959, - 1033, - 1248, - 1412, - 1430, - 1444, - 1524 + 1464 + ], + "errorMessage": "invalid array length header" + }, + { + "pc": [ + 443, + 492, + 516, + 641, + 703, + 728, + 732, + 802, + 829, + 833, + 837, + 863, + 886, + 903, + 918, + 961, + 1037, + 1252, + 1416, + 1434, + 1448, + 1528 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 1667 + 1671 ], "errorMessage": "no available slots" } @@ -353,19 +359,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDEgMCA1IDUxMgogICAgYnl0ZWNibG9jayAweCAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMyAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMDAwMDAwMDA0CiAgICBwdXNoYnl0ZXMgMHg3ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCiAgICBzdG9yZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMwogICAgLy8gY2xhc3MgQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTMzYmU4NzMgMHhlMGMzNzhlOSAweDM2NmY1MDlkIDB4NTgzNTFhNTAgMHhmYTk5ZTk4NCAweGEyMGU0NDBmIDB4MTc5YWMzZjkgMHg0NWRjYzgzNiAweGYxN2Y2ZjBhIDB4ODQ1ZTFiNGUgMHg3NjIxY2ZkMSAweDU2NjFhNjdjIC8vIG1ldGhvZCAidGVzdF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcnJheV9leHRlbmQoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJyYXlfbXVsdGlwbGVfYXBwZW5kKCl2b2lkIiwgbWV0aG9kICJvdmVyaGVhZCgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcnJheV90b29fbG9uZygpdm9pZCIsIG1ldGhvZCAidGVzdF9hcnJheV9jb3B5X2FuZF9leHRlbmQoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJyYXlfZXZhbHVhdGlvbl9vcmRlcigpdm9pZCIsIG1ldGhvZCAidGVzdF9hcnJheV9hc3NpZ25tZW50X21heGltdW1fY3Vyc2FnZSgpdm9pZCIsIG1ldGhvZCAidGVzdF9hbGxvY2F0aW9ucyh1aW50NjQpdm9pZCIsIG1ldGhvZCAidGVzdF9pdGVyYXRpb24oKXZvaWQiLCBtZXRob2QgInRlc3RfcXVpY2tzb3J0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3Vub2JzZXJ2ZWRfd3JpdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2FycmF5IHRlc3RfYXJyYXlfZXh0ZW5kIHRlc3RfYXJyYXlfbXVsdGlwbGVfYXBwZW5kIG1haW5fb3ZlcmhlYWRfcm91dGVANyB0ZXN0X2FycmF5X3Rvb19sb25nIHRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kIHRlc3RfYXJyYXlfZXZhbHVhdGlvbl9vcmRlciB0ZXN0X2FycmF5X2Fzc2lnbm1lbnRfbWF4aW11bV9jdXJzYWdlIHRlc3RfYWxsb2NhdGlvbnMgdGVzdF9pdGVyYXRpb24gdGVzdF9xdWlja3NvcnQgdGVzdF91bm9ic2VydmVkX3dyaXRlCiAgICBlcnIKCm1haW5fb3ZlcmhlYWRfcm91dGVANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LnF1aWNrc29ydF93aW5kb3coYXJyOiB1aW50NjQsIHdpbmRvd19sZWZ0OiB1aW50NjQsIHdpbmRvd19yaWdodDogdWludDY0KSAtPiB2b2lkOgpxdWlja3NvcnRfd2luZG93OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjAxLTIwNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBxdWlja3NvcnRfd2luZG93KAogICAgLy8gICAgIGFycjogUmVmZXJlbmNlQXJyYXlbVUludDY0XSwgd2luZG93X2xlZnQ6IFVJbnQ2NCwgd2luZG93X3JpZ2h0OiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMDcKICAgIC8vIHBpdm90ID0gYXJyWyh3aW5kb3dfbGVmdCArIHdpbmRvd19yaWdodCkgLy8gMl0KICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBwdXNoaW50IDIgLy8gMgogICAgLwogICAgZnJhbWVfZGlnIC0zCiAgICBsb2FkcwogICAgc3dhcAogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMgoKcXVpY2tzb3J0X3dpbmRvd193aGlsZV90b3BAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIxMS0yMTIKICAgIC8vICMgbW92ZSBsZWZ0IG9mIHdpbmRvdyB0b3dhcmRzIHBpdm90CiAgICAvLyB3aGlsZSBhcnJbbGVmdF0gPCBwaXZvdDoKICAgIGZyYW1lX2RpZyAtMwogICAgbG9hZHMKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogcXVpY2tzb3J0X3dpbmRvd193aGlsZV90b3BANgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjEzCiAgICAvLyBsZWZ0ICs9IDEKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIHF1aWNrc29ydF93aW5kb3dfd2hpbGVfdG9wQDMKCnF1aWNrc29ydF93aW5kb3dfd2hpbGVfdG9wQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMTQtMjE1CiAgICAvLyAjIG1vdmUgcmlnaHQgb2Ygd2luZG93IHRvd2FyZHMgcGl2b3QKICAgIC8vIHdoaWxlIHBpdm90IDwgYXJyW3JpZ2h0XToKICAgIGZyYW1lX2RpZyAtMwogICAgbG9hZHMKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMgogICAgPgogICAgYnogcXVpY2tzb3J0X3dpbmRvd19hZnRlcl93aGlsZUAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjE2LTIxNwogICAgLy8gIyBicmVhayBvdXQgb2YgbG9vcCBpZiByaWdodCB3b3VsZCBnbyBuZWdhdGl2ZQogICAgLy8gaWYgbm90IHJpZ2h0OgogICAgZnJhbWVfZGlnIDMKICAgIGJ6IHF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfd2hpbGVAMjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIxOQogICAgLy8gcmlnaHQgLT0gMQogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgcXVpY2tzb3J0X3dpbmRvd193aGlsZV90b3BANgoKcXVpY2tzb3J0X3dpbmRvd19hZnRlcl93aGlsZUAyMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI0Ny0yNDgKICAgIC8vICMgc29ydCBsZWZ0IGhhbGYgb2Ygd2luZG93CiAgICAvLyBpZiB3aW5kb3dfbGVmdCA8IHJpZ2h0OgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogcXVpY2tzb3J0X3dpbmRvd19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNDkKICAgIC8vIHF1aWNrc29ydF93aW5kb3coYXJyLCB3aW5kb3dfbGVmdCwgcmlnaHQpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgcXVpY2tzb3J0X3dpbmRvdwoKcXVpY2tzb3J0X3dpbmRvd19hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjUwLTI1MQogICAgLy8gIyBzb3J0IHJpZ2h0IGhhbGYgb2Ygd2luZG93CiAgICAvLyBpZiBsZWZ0IDwgd2luZG93X3JpZ2h0OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogcXVpY2tzb3J0X3dpbmRvd19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNTIKICAgIC8vIHF1aWNrc29ydF93aW5kb3coYXJyLCBsZWZ0LCB3aW5kb3dfcmlnaHQpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgcXVpY2tzb3J0X3dpbmRvdwoKcXVpY2tzb3J0X3dpbmRvd19hZnRlcl9pZl9lbHNlQDI2OgogICAgcmV0c3ViCgpxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjIxLTIyMgogICAgLy8gIyBpZiB3aW5kb3cgaXNuJ3QgZW1wdHkgdGhlbiBzd2FwIHZhbHVlcyBhbmQgbW92ZSB3aW5kb3cgaW4KICAgIC8vIGlmIGxlZnQgPCByaWdodDoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogcXVpY2tzb3J0X3dpbmRvd19hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMjMKICAgIC8vIGFycltsZWZ0XSwgYXJyW3JpZ2h0XSA9IGFycltyaWdodF0sIGFycltsZWZ0XQogICAgZnJhbWVfZGlnIC0zCiAgICBsb2FkcwogICAgZHVwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgY292ZXIgMwogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBjb3ZlciAyCiAgICByZXBsYWNlMyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMwogICAgc3dhcAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMjQKICAgIC8vIGxlZnQgKz0gMQogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIyNS0yMjYKICAgIC8vICMgYnJlYWsgb3V0IG9mIGxvb3AgaWYgcmlnaHQgd291bGQgZ28gbmVnYXRpdmUKICAgIC8vIGlmIG5vdCByaWdodDoKICAgIGZyYW1lX2RpZyAzCiAgICBieiBxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDIyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMjgKICAgIC8vIHJpZ2h0IC09IDEKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIyOS0yMzAKICAgIC8vICMgZXhwbGljaXQgY29udGludWUgdG8gYXZvaWQgaGl0dGluZyBvdXRlciBicmVhawogICAgLy8gaWYgbGVmdCA8PSByaWdodDoKICAgIGZyYW1lX2RpZyA0CiAgICA+PQogICAgYm56IHF1aWNrc29ydF93aW5kb3dfd2hpbGVfdG9wQDMKICAgIGIgcXVpY2tzb3J0X3dpbmRvd19hZnRlcl93aGlsZUAyMgoKcXVpY2tzb3J0X3dpbmRvd19hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjM1LTIzNgogICAgLy8gIyBpZiB3aW5kb3cgaXMganVzdCBvbmUgaXRlbSwgZG9uJ3QgYm90aGVyIHN3YXBwaW5nLCBidXQgc3RpbGwgYWRqdXN0IHdpbmRvdwogICAgLy8gaWYgbGVmdCA9PSByaWdodDoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPT0KICAgIGJ6IHF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfd2hpbGVAMjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIzNwogICAgLy8gbGVmdCArPSAxCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjM4LTIzOQogICAgLy8gIyBkb24ndCBkZWNyZW1lbnQgcmlnaHQgaWYgaXQgd291bGQgZ28gbmVnYXRpdmUKICAgIC8vIGlmIHJpZ2h0OgogICAgZnJhbWVfZGlnIDMKICAgIGJ6IHF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfd2hpbGVAMjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI0MAogICAgLy8gcmlnaHQgLT0gMQogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgcXVpY2tzb3J0X3dpbmRvd19hZnRlcl93aGlsZUAyMgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LmNyZWF0ZV9hcnJheSgpIC0+IHVpbnQ2NDoKY3JlYXRlX2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjU1LTI1NgogICAgLy8gQHN1YnJvdXRpbmUoaW5saW5lPUZhbHNlKQogICAgLy8gZGVmIGNyZWF0ZV9hcnJheSgpIC0+IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF06CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1NwogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNTgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMiAvLyAwCgpjcmVhdGVfYXJyYXlfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjU4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18zIC8vIDUKICAgIDwKICAgIGJ6IGNyZWF0ZV9hcnJheV9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjU5CiAgICAvLyBhcnIuYXBwZW5kKGkpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBsb2FkcwogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBjcmVhdGVfYXJyYXlfZm9yX2hlYWRlckAxCgpjcmVhdGVfYXJyYXlfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNjAKICAgIC8vIHJldHVybiBhcnIKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LmFzc2VydF9sYXN0X2lzX3plcm8oYXJyOiB1aW50NjQpIC0+IHZvaWQ6CmFzc2VydF9sYXN0X2lzX3plcm86CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNjMtMjY0CiAgICAvLyBAc3Vicm91dGluZShpbmxpbmU9RmFsc2UpCiAgICAvLyBkZWYgYXNzZXJ0X2xhc3RfaXNfemVybyhhcnI6IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI2NQogICAgLy8gYXNzZXJ0IGFyclthcnIubGVuZ3RoIC0gMV0gPT0gMAogICAgZnJhbWVfZGlnIC0xCiAgICBsb2FkcwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAhCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LmFkZF94KGFycjogdWludDY0LCB4OiB1aW50NjQpIC0+IHZvaWQ6CmFkZF94OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjc3LTI3OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZGRfeChhcnI6IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0sIHg6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzIgLy8gMAoKYWRkX3hfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiBhZGRfeF9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjgwCiAgICAvLyBhcnIuYXBwZW5kKGkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxvYWRzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNzkKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgYWRkX3hfZm9yX2hlYWRlckAxCgphZGRfeF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LmFwcGVuZF9sZW5ndGhfYW5kX3JldHVybihhcnI6IHVpbnQ2NCkgLT4gdWludDY0OgphcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyOTEtMjkyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFwcGVuZF9sZW5ndGhfYW5kX3JldHVybihhcnI6IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0pIC0+IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF06CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI5MwogICAgLy8gYXJyLmFwcGVuZChhcnIubGVuZ3RoKQogICAgZnJhbWVfZGlnIC0xCiAgICBsb2FkcwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyOTQKICAgIC8vIHJldHVybiBhcnIKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNgogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTkKICAgIC8vIGFyci5hcHBlbmQoVUludDY0KDQyKSkKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGl0b2IKICAgIGRpZyAxCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIzCiAgICAvLyBhZGRfeChhcnIsIFVJbnQ2NCg1KSkKICAgIGR1cAogICAgaW50Y18zIC8vIDUKICAgIGNhbGxzdWIgYWRkX3gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA2CiAgICBsb2FkcwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI3CiAgICAvLyBwb3BfeChhcnIsIHg9VUludDY0KDMpLCBleHBlY3RlZD1VSW50NjQoNCkpCiAgICBwdXNoaW50IDQgLy8gNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjg1CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgaW50Y18yIC8vIDAKCnRlc3RfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjg1CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNwogICAgLy8gcG9wX3goYXJyLCB4PVVJbnQ2NCgzKSwgZXhwZWN0ZWQ9VUludDY0KDQpKQogICAgcHVzaGludCAzIC8vIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI4NQogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI4NgogICAgLy8gcG9wcGVkID0gYXJyLnBvcCgpCiAgICBkaWcgMgogICAgZHVwCiAgICBsb2FkcwogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIC0KICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMAogICAgZGlnIDIKICAgIGV4dHJhY3QzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICBjb3ZlciAyCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI4NwogICAgLy8gYXNzZXJ0IHBvcHBlZCA9PSBleHBlY3RlZAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjg4CiAgICAvLyBleHBlY3RlZCAtPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgYnVyeSAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyODUKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UoeCk6CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyOAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gMwogICAgZGlnIDIKICAgIGR1cAogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgZHVwCiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjkKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MzEKICAgIC8vIGFyci5hcHBlbmQoVUludDY0KDQzKSkKICAgIHB1c2hpbnQgNDMgLy8gNDMKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZHVwMgogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTozMgogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTozMwogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQzIC8vIDQzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTozNAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSA0MgogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTozNgogICAgLy8gYWRkX3goYXJyLCBVSW50NjQoMTApKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTozNwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gMTQKICAgIGR1cAogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgZHVwCiAgICBwdXNoaW50IDE0IC8vIDE0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTozOAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gOQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgOSAvLyA5CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo0MAogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoNDQpKQogICAgcHVzaGludCA0NCAvLyA0NAogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo0MQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gMTUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgZHVwCiAgICBwdXNoaW50IDE1IC8vIDE1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo0MgogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDQKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQ0IC8vIDQ0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNzIKICAgIC8vIGFyci5hcHBlbmQoVUludDY0KDk5KSkKICAgIHB1c2hpbnQgOTkgLy8gOTkKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjczCiAgICAvLyBhcnIyLmFwcGVuZChVSW50NjQoMTAwKSkKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo0NAogICAgLy8gcmV0dXJuX3JlZihhcnIsIGFycilbMF0gKz0gMgogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAwIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZGlnIDEKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NDUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE3CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGR1cAogICAgcHVzaGludCAxNyAvLyAxNwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NDYKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gNDQKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDQgLy8gNDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjQ3CiAgICAvLyBhc3NlcnQgYXJyWy0yXSA9PSA5OQogICAgZHVwCiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGRpZyAyCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA5OSAvLyA5OQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NDgKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDEwMAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X2FycmF5X2V4dGVuZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJyYXlfZXh0ZW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NTIKICAgIC8vIGFyciA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NTMKICAgIC8vIGFkZF94KGFyciwgVUludDY0KDEpKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBhZGRfeAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NTcKICAgIC8vIGFycjIuYXBwZW5kKFVJbnQ2NCgzKSkKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NTkKICAgIC8vIGFyci5leHRlbmQoYXJyMikKICAgIGR1cAogICAgbG9hZHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjU3CiAgICAvLyBhcnIyLmFwcGVuZChVSW50NjQoMykpCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1OQogICAgLy8gYXJyLmV4dGVuZChhcnIyKQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBkaWcgMQogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo2MAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYXJyYXlfbXVsdGlwbGVfYXBwZW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9tdWx0aXBsZV9hcHBlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo2NAogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo2NQogICAgLy8gYWRkX3goYXJyLCBVSW50NjQoMSkpCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo2NgogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoMSkpCiAgICBkdXAKICAgIGxvYWRzCiAgICBpbnRjXzEgLy8gMQogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo2NwogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoMikpCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo2OAogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoMykpCiAgICBwdXNoaW50IDMgLy8gMwogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBkaWcgMQogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo2OQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYXJyYXlfdG9vX2xvbmdbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FycmF5X3Rvb19sb25nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NzcKICAgIC8vIGFycmF5ID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBieXRlY18wIC8vIDB4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo3OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUxMik6CiAgICBpbnRjXzIgLy8gMAoKdGVzdF9hcnJheV90b29fbG9uZ19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo3OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUxMik6CiAgICBkdXAKICAgIGludGMgNCAvLyA1MTIKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfdG9vX2xvbmdfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojc5CiAgICAvLyBhcnJheS5hcHBlbmQoaSkKICAgIGR1cDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojc4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNTEyKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcnJheV90b29fbG9uZ19mb3JfaGVhZGVyQDIKCnRlc3RfYXJyYXlfdG9vX2xvbmdfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6ODAKICAgIC8vIGFzc2VydCBhcnJheS5sZW5ndGggPT0gNTEyLCAiYXJyYXkgaXMgZXhwZWN0ZWQgbGVuZ3RoIgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjIDQgLy8gNTEyCiAgICA9PQogICAgYXNzZXJ0IC8vIGFycmF5IGlzIGV4cGVjdGVkIGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6ODIKICAgIC8vIGFycmF5LmFwcGVuZChVSW50NjQoNTEyKSkgICMgdGhpcyB3aWxsIGZhaWwKICAgIGludGMgNCAvLyA1MTIKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X2FycmF5X2NvcHlfYW5kX2V4dGVuZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6ODYKICAgIC8vIGFycmF5ID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBieXRlY18wIC8vIDB4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4NwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18yIC8vIDAKCnRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojg3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIGludGNfMyAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2FycmF5X2NvcHlfYW5kX2V4dGVuZF9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6ODgKICAgIC8vIGFycmF5LmFwcGVuZChpKQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6ODcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcnJheV9jb3B5X2FuZF9leHRlbmRfZm9yX2hlYWRlckAyCgp0ZXN0X2FycmF5X2NvcHlfYW5kX2V4dGVuZF9hZnRlcl9mb3JANToKICAgIGRpZyAxCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjkxCiAgICAvLyBhcnJheS5hcHBlbmQoVUludDY0KDUpKQogICAgaW50Y18zIC8vIDUKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6OTIKICAgIC8vIGFzc2VydCBhcnJheS5sZW5ndGggPT0gNgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo5MwogICAgLy8gYXNzZXJ0IGFycmF5Wy0xXSA9PSA1LCAiZXhwZWN0ZWQgNSIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzMgLy8gNQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCA1CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6OTUKICAgIC8vIGFzc2VydCBhcnJheTIubGVuZ3RoID09IDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgZHVwCiAgICBpbnRjXzMgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6OTYKICAgIC8vIGFzc2VydCBhcnJheTJbLTFdID09IDQsICJleHBlY3RlZCA0IgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojk4CiAgICAvLyBhcnJheS5leHRlbmQoYXJyYXkyKQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo5OQogICAgLy8gYXNzZXJ0IGFycmF5Lmxlbmd0aCA9PSAxMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgMTEgLy8gMTEKICAgID09CiAgICBhc3NlcnQKICAgIHVuY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTAwCiAgICAvLyBhc3NlcnQgYXJyYXkyLmxlbmd0aCA9PSA1CiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzMgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTAxCiAgICAvLyBhc3NlcnQgYXJyYXlbLTFdID09IDQsICJleHBlY3RlZCA0IgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEwMgogICAgLy8gYXNzZXJ0IGFycmF5WzRdID09IDQsICJleHBlY3RlZCA0IgogICAgZHVwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTAzCiAgICAvLyBhc3NlcnQgYXJyYXlbNV0gPT0gNSwgImV4cGVjdGVkIDQiCiAgICBkdXAKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzMgLy8gNQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMDQKICAgIC8vIGFzc2VydCBhcnJheVs2XSA9PSAwLCAiZXhwZWN0ZWQgNCIKICAgIHB1c2hpbnQgNDggLy8gNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybiAvLyBvbiBlcnJvcjogZXhwZWN0ZWQgNAoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYXJyYXlfZXZhbHVhdGlvbl9vcmRlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJyYXlfZXZhbHVhdGlvbl9vcmRlcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEwOAogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEwOQogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoMykpCiAgICBwdXNoaW50IDMgLy8gMwogICAgaXRvYgogICAgZGlnIDEKICAgIHN3YXAKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTEwCiAgICAvLyBhcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4oYXJyKS5leHRlbmQoYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuKGFycikpCiAgICBkdXAKICAgIGNhbGxzdWIgYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuCiAgICBkaWcgMQogICAgY2FsbHN1YiBhcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4KICAgIGxvYWRzCiAgICBkaWcgMQogICAgbG9hZHMKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTEKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDYKICAgIGR1cAogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjExMgogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAzCiAgICBkdXAKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjExMwogICAgLy8gYXNzZXJ0IGFyclsxXSA9PSAxCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjExNAogICAgLy8gYXNzZXJ0IGFyclsyXSA9PSAyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTE1CiAgICAvLyBhc3NlcnQgYXJyWzNdID09IDMKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTYKICAgIC8vIGFzc2VydCBhcnJbNF0gPT0gMQogICAgZHVwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjExNwogICAgLy8gYXNzZXJ0IGFycls1XSA9PSAyCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjExOQogICAgLy8gYXJyW2FwcGVuZF9sZW5ndGhfYW5kX3JldHVybihhcnIpWzBdXSA9IGFwcGVuZF9sZW5ndGhfYW5kX3JldHVybihhcnIpWy0xXQogICAgZHVwCiAgICBjYWxsc3ViIGFwcGVuZF9sZW5ndGhfYW5kX3JldHVybgogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgY2FsbHN1YiBhcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4KICAgIGxvYWRzCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBsb2FkcwogICAgc3dhcAogICAgaW50Y18wIC8vIDgKICAgICoKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBkaWcgMQogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMjAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEyMQogICAgLy8gYXNzZXJ0IGFycls2XSA9PSA2CiAgICBkdXAKICAgIHB1c2hpbnQgNDggLy8gNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTIyCiAgICAvLyBhc3NlcnQgYXJyWzddID09IDcKICAgIGR1cAogICAgcHVzaGludCA1NiAvLyA1NgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNyAvLyA3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMjMKICAgIC8vIGFzc2VydCBhcnJbM10gPT0gNgogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTA2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9hcnJheV9hc3NpZ25tZW50X21heGltdW1fY3Vyc2FnZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJyYXlfYXNzaWdubWVudF9tYXhpbXVtX2N1cnNhZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMjcKICAgIC8vIGFyciA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMjgKICAgIC8vIGFyci5hcHBlbmQoVUludDY0KDMpKQogICAgcHVzaGludCAzIC8vIDMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEyOQogICAgLy8gYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuKGFycilbMF0gPSBVSW50NjQoNDIpCiAgICBkdXAKICAgIGNhbGxzdWIgYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBpdG9iCiAgICBkaWcgMQogICAgbG9hZHMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEzMAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gMgogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEzMQogICAgLy8gYXNzZXJ0IGFyclswXSA9PSA0MgogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEzMgogICAgLy8gYXNzZXJ0IGFyclsxXSA9PSAxCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9hbGxvY2F0aW9uc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYWxsb2NhdGlvbnM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzYKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UobnVtKToKICAgIGludGNfMiAvLyAwCgp0ZXN0X2FsbG9jYXRpb25zX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEzNgogICAgLy8gZm9yIF9pIGluIHVyYW5nZShudW0pOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdGVzdF9hbGxvY2F0aW9uc19hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM3CiAgICAvLyBhbGxvY190ZXN0ID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzgKICAgIC8vIGFkZF94KGFsbG9jX3Rlc3QsIFVJbnQ2NCgxKSkKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzYKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UobnVtKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FsbG9jYXRpb25zX2Zvcl9oZWFkZXJAMgoKdGVzdF9hbGxvY2F0aW9uc19hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X2l0ZXJhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaXRlcmF0aW9uOgogICAgaW50Y18yIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQyCiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGR1cG4gNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQzCiAgICAvLyBmb3IgdmFsIGluIHVyYW5nZSg1KToKICAgIGludGNfMiAvLyAwCgp0ZXN0X2l0ZXJhdGlvbl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDMKICAgIC8vIGZvciB2YWwgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBpbnRjXzMgLy8gNQogICAgPAogICAgYnogdGVzdF9pdGVyYXRpb25fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0NAogICAgLy8gYXJyLmFwcGVuZCh2YWwpCiAgICBkdXAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDMKICAgIC8vIGZvciB2YWwgaW4gdXJhbmdlKDUpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2l0ZXJhdGlvbl9mb3JfaGVhZGVyQDIKCnRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0NQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNSwgImV4cGVjdGVkIGFycmF5IG9mIGxlbmd0aCA1IgogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgZHVwCiAgICBidXJ5IDEwCiAgICBpbnRjXzMgLy8gNQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcnJheSBvZiBsZW5ndGggNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQ3LTE0OAogICAgLy8gIyBpdGVyYXRlCiAgICAvLyBsYXN0ID0gVUludDY0KDApCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSA0CiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X2l0ZXJhdGlvbl9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDkKICAgIC8vIGZvciB2YWx1ZSBpbiBhcnI6CiAgICBkaWcgNAogICAgZGlnIDkKICAgIDwKICAgIGJ6IHRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckA5CiAgICBkaWcgMQogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNTAKICAgIC8vIGFzc2VydCB2YWx1ZSA+PSBsYXN0LCAiYXJyYXkgaXMgbm90IHNvcnRlZCIKICAgIGR1cAogICAgZGlnIDYKICAgID49CiAgICBhc3NlcnQgLy8gYXJyYXkgaXMgbm90IHNvcnRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNgogICAgYnVyeSA0CiAgICBiIHRlc3RfaXRlcmF0aW9uX2Zvcl9oZWFkZXJANgoKdGVzdF9pdGVyYXRpb25fYWZ0ZXJfZm9yQDk6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTUzLTE1NAogICAgLy8gIyBlbnVtZXJhdGUKICAgIC8vIGZvciBpZHgsIHZhbHVlIGluIHVlbnVtZXJhdGUoYXJyKToKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGJ1cnkgOAogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNgoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE1My0xNTQKICAgIC8vICMgZW51bWVyYXRlCiAgICAvLyBmb3IgaWR4LCB2YWx1ZSBpbiB1ZW51bWVyYXRlKGFycik6CiAgICBkaWcgNQogICAgZGlnIDgKICAgIDwKICAgIGJ6IHRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckAxMwogICAgZGlnIDEKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTU1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gaWR4LCAiaW5jb3JyZWN0IGFycmF5IHZhbHVlIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW5jb3JyZWN0IGFycmF5IHZhbHVlCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBiIHRlc3RfaXRlcmF0aW9uX2Zvcl9oZWFkZXJAMTAKCnRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckAxMzoKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNTctMTU4CiAgICAvLyAjIHJldmVyc2UKICAgIC8vIGZvciB2YWx1ZSBpbiByZXZlcnNlZChhcnIpOgogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgYnVyeSAzCgp0ZXN0X2l0ZXJhdGlvbl9mb3JfaGVhZGVyQDE0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTU3LTE1OAogICAgLy8gIyByZXZlcnNlCiAgICAvLyBmb3IgdmFsdWUgaW4gcmV2ZXJzZWQoYXJyKToKICAgIGRpZyAyCiAgICBieiB0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAMTcKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBidXJ5IDQKICAgIGRpZyAyCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE1OQogICAgLy8gYXNzZXJ0IHZhbHVlIDw9IGxhc3QsICJhcnJheSBpcyBub3Qgc29ydGVkIgogICAgZHVwCiAgICBkaWcgNQogICAgPD0KICAgIGFzc2VydCAvLyBhcnJheSBpcyBub3Qgc29ydGVkCiAgICBidXJ5IDQKICAgIGIgdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAxNAoKdGVzdF9pdGVyYXRpb25fYWZ0ZXJfZm9yQDE3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTYyCiAgICAvLyBhcmM0X2FyciA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSgpCiAgICBwdXNoYnl0ZXMgMHgwMDAwCiAgICBidXJ5IDExCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDIKICAgIC8vIGFyciA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgYnl0ZWNfMCAvLyAweAogICAgYnVyeSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY0CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSA3Cgp0ZXN0X2l0ZXJhdGlvbl9mb3JfaGVhZGVyQDE4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY0CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkaWcgNgogICAgaW50Y18zIC8vIDUKICAgIDwKICAgIGJ6IHRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckAyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY1CiAgICAvLyBhcmM0X2Fyci5hcHBlbmQoYXJjNC5VSW50NjQoaSkpCiAgICBkaWcgNgogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMTIKICAgIGR1cAogICAgY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAxMwogICAgZGlnIDExCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNjYKICAgIC8vIG5hdGl2ZV9hcnIuYXBwZW5kKGFyYzQuVUludDY0KGkpKQogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBidXJ5IDExCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNjQKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDcKICAgIGIgdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAxOAoKdGVzdF9pdGVyYXRpb25fYWZ0ZXJfZm9yQDIxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY3CiAgICAvLyBjb21iaW5lZF9hcnIgPSBhcmM0X2FyciArIG5hdGl2ZV9hcnIKICAgIGRpZyAxMAogICAgZGlnIDEwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNjgKICAgIC8vIGFzc2VydCBjb21iaW5lZF9hcnIubGVuZ3RoID09IDEwCiAgICBkdXAKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAxMCAvLyAxMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY5CiAgICAvLyBhc3NlcnQgY29tYmluZWRfYXJyWzBdID09IDAKICAgIGR1cAogICAgZXh0cmFjdCAyIDgKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTcwCiAgICAvLyBhc3NlcnQgY29tYmluZWRfYXJyWzRdID09IDQKICAgIGR1cAogICAgZXh0cmFjdCAzNCA4CiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwNAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGNvbWJpbmVkX2Fycls1XSA9PSAwCiAgICBkdXAKICAgIGV4dHJhY3QgNDIgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNzIKICAgIC8vIGFzc2VydCBjb21iaW5lZF9hcnJbOV0gPT0gNAogICAgZXh0cmFjdCA3NCA4CiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwNAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X3F1aWNrc29ydFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcXVpY2tzb3J0OgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNzYtMTc3CiAgICAvLyAjIGNyZWF0ZSBwc2V1ZG8gcmFuZG9tIGFycmF5IGZyb20gc2VuZGVyIGFkZHJlc3MKICAgIC8vIHJuZCA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTc4CiAgICAvLyBmb3IgYiBpbiBUeG4uc2VuZGVyLmJ5dGVzOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18yIC8vIDAKCnRlc3RfcXVpY2tzb3J0X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3OAogICAgLy8gZm9yIGIgaW4gVHhuLnNlbmRlci5ieXRlczoKICAgIGR1cAogICAgcHVzaGludCAzMiAvLyAzMgogICAgPAogICAgYnogdGVzdF9xdWlja3NvcnRfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3OQogICAgLy8gcm5kLmFwcGVuZChvcC5idG9pKGIpKQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRieXRlCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsb2FkcwogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzdG9yZXMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9xdWlja3NvcnRfZm9yX2hlYWRlckAyCgp0ZXN0X3F1aWNrc29ydF9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE4MAogICAgLy8gYXNzZXJ0IHJuZC5sZW5ndGggPT0gMzIsICJleHBlY3RlZCBhcnJheSBvZiBsZW5ndGggMzIiCiAgICBkaWcgMgogICAgZHVwCiAgICBsb2FkcwogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgZHVwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFycmF5IG9mIGxlbmd0aCAzMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTgyLTE4MwogICAgLy8gIyBzb3J0IHRoZSBhcnJheQogICAgLy8gcXVpY2tzb3J0X3dpbmRvdyhybmQsIFVJbnQ2NCgwKSwgcm5kLmxlbmd0aCAtIDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgcXVpY2tzb3J0X3dpbmRvdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTg1LTE4NgogICAgLy8gIyBhcnJheSBzaG91bGQgbm93IGJlIGluIGFzY2VuZGluZyBvcmRlcgogICAgLy8gbGFzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTg3CiAgICAvLyBmb3IgdmFsdWUgaW4gcm5kOgogICAgbG9hZHMKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGJ1cnkgNgogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9xdWlja3NvcnRfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTg3CiAgICAvLyBmb3IgdmFsdWUgaW4gcm5kOgogICAgZGlnIDQKICAgIGRpZyA2CiAgICA8CiAgICBieiB0ZXN0X3F1aWNrc29ydF9hZnRlcl9mb3JAOQogICAgZGlnIDIKICAgIGxvYWRzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE4OAogICAgLy8gYXNzZXJ0IHZhbHVlID49IGxhc3QsICJhcnJheSBpcyBub3Qgc29ydGVkIgogICAgZHVwCiAgICBkaWcgNgogICAgPj0KICAgIGFzc2VydCAvLyBhcnJheSBpcyBub3Qgc29ydGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBidXJ5IDQKICAgIGIgdGVzdF9xdWlja3NvcnRfZm9yX2hlYWRlckA2Cgp0ZXN0X3F1aWNrc29ydF9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X3Vub2JzZXJ2ZWRfd3JpdGVbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3Vub2JzZXJ2ZWRfd3JpdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTMKICAgIC8vIGFyciA9IGNyZWF0ZV9hcnJheSgpCiAgICBjYWxsc3ViIGNyZWF0ZV9hcnJheQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTk0CiAgICAvLyBsYXN0ID0gYXJyLmxlbmd0aCAtIDEKICAgIGR1cAogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE5NQogICAgLy8gYXJyW2xhc3RdID0gVUludDY0KDApICAjIHdyaXRlCiAgICBpbnRjXzIgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgaW50Y18wIC8vIDgKICAgICoKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgc3dhcAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTYKICAgIC8vIGFzc2VydF9sYXN0X2lzX3plcm8oYXJyKQogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X2xhc3RfaXNfemVybwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTk3CiAgICAvLyBhcnJbbGFzdF0gPSBVSW50NjQoMSkgICMgd3JpdGUKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBkaWcgMgogICAgbG9hZHMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTgKICAgIC8vIGFzc2VydCBhcnJbbGFzdF0gPT0gMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLm1lbS5uZXdfc2xvdCgpIC0+IHVpbnQ2NDoKX3B1eWFfbGliLm1lbS5uZXdfc2xvdDoKICAgIGxvYWQgMAogICAgYml0bGVuCiAgICBsb2FkIDAKICAgIHB1c2hpbnQgMjU2IC8vIDI1NgogICAgZGlnIDIKICAgIC0KICAgIGludGNfMiAvLyAwCiAgICBzZXRiaXQgLy8gb24gZXJyb3I6IG5vIGF2YWlsYWJsZSBzbG90cwogICAgc3RvcmUgMAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDEgMCA1IDUxMgogICAgYnl0ZWNibG9jayAweCAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMyAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMDAwMDAwMDA0CiAgICBwdXNoYnl0ZXMgMHg3ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCiAgICBzdG9yZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMwogICAgLy8gY2xhc3MgQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTMzYmU4NzMgMHhlMGMzNzhlOSAweDM2NmY1MDlkIDB4NTgzNTFhNTAgMHhmYTk5ZTk4NCAweGEyMGU0NDBmIDB4MTc5YWMzZjkgMHg0NWRjYzgzNiAweGYxN2Y2ZjBhIDB4ODQ1ZTFiNGUgMHg3NjIxY2ZkMSAweDU2NjFhNjdjIC8vIG1ldGhvZCAidGVzdF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcnJheV9leHRlbmQoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJyYXlfbXVsdGlwbGVfYXBwZW5kKCl2b2lkIiwgbWV0aG9kICJvdmVyaGVhZCgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcnJheV90b29fbG9uZygpdm9pZCIsIG1ldGhvZCAidGVzdF9hcnJheV9jb3B5X2FuZF9leHRlbmQoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJyYXlfZXZhbHVhdGlvbl9vcmRlcigpdm9pZCIsIG1ldGhvZCAidGVzdF9hcnJheV9hc3NpZ25tZW50X21heGltdW1fY3Vyc2FnZSgpdm9pZCIsIG1ldGhvZCAidGVzdF9hbGxvY2F0aW9ucyh1aW50NjQpdm9pZCIsIG1ldGhvZCAidGVzdF9pdGVyYXRpb24oKXZvaWQiLCBtZXRob2QgInRlc3RfcXVpY2tzb3J0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3Vub2JzZXJ2ZWRfd3JpdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2FycmF5IHRlc3RfYXJyYXlfZXh0ZW5kIHRlc3RfYXJyYXlfbXVsdGlwbGVfYXBwZW5kIG1haW5fb3ZlcmhlYWRfcm91dGVANyB0ZXN0X2FycmF5X3Rvb19sb25nIHRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kIHRlc3RfYXJyYXlfZXZhbHVhdGlvbl9vcmRlciB0ZXN0X2FycmF5X2Fzc2lnbm1lbnRfbWF4aW11bV9jdXJzYWdlIHRlc3RfYWxsb2NhdGlvbnMgdGVzdF9pdGVyYXRpb24gdGVzdF9xdWlja3NvcnQgdGVzdF91bm9ic2VydmVkX3dyaXRlCiAgICBlcnIKCm1haW5fb3ZlcmhlYWRfcm91dGVANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQucXVpY2tzb3J0X3dpbmRvdyhhcnI6IHVpbnQ2NCwgd2luZG93X2xlZnQ6IHVpbnQ2NCwgd2luZG93X3JpZ2h0OiB1aW50NjQpIC0+IHZvaWQ6CnF1aWNrc29ydF93aW5kb3c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMDEtMjA0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHF1aWNrc29ydF93aW5kb3coCiAgICAvLyAgICAgYXJyOiBSZWZlcmVuY2VBcnJheVtVSW50NjRdLCB3aW5kb3dfbGVmdDogVUludDY0LCB3aW5kb3dfcmlnaHQ6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIwNwogICAgLy8gcGl2b3QgPSBhcnJbKHdpbmRvd19sZWZ0ICsgd2luZG93X3JpZ2h0KSAvLyAyXQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAvCiAgICBmcmFtZV9kaWcgLTMKICAgIGxvYWRzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCgpxdWlja3NvcnRfd2luZG93X3doaWxlX3RvcEAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjExLTIxMgogICAgLy8gIyBtb3ZlIGxlZnQgb2Ygd2luZG93IHRvd2FyZHMgcGl2b3QKICAgIC8vIHdoaWxlIGFycltsZWZ0XSA8IHBpdm90OgogICAgZnJhbWVfZGlnIC0zCiAgICBsb2FkcwogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBxdWlja3NvcnRfd2luZG93X3doaWxlX3RvcEA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMTMKICAgIC8vIGxlZnQgKz0gMQogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgcXVpY2tzb3J0X3dpbmRvd193aGlsZV90b3BAMwoKcXVpY2tzb3J0X3dpbmRvd193aGlsZV90b3BANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIxNC0yMTUKICAgIC8vICMgbW92ZSByaWdodCBvZiB3aW5kb3cgdG93YXJkcyBwaXZvdAogICAgLy8gd2hpbGUgcGl2b3QgPCBhcnJbcmlnaHRdOgogICAgZnJhbWVfZGlnIC0zCiAgICBsb2FkcwogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICBieiBxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMTYtMjE3CiAgICAvLyAjIGJyZWFrIG91dCBvZiBsb29wIGlmIHJpZ2h0IHdvdWxkIGdvIG5lZ2F0aXZlCiAgICAvLyBpZiBub3QgcmlnaHQ6CiAgICBmcmFtZV9kaWcgMwogICAgYnogcXVpY2tzb3J0X3dpbmRvd19hZnRlcl93aGlsZUAyMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjE5CiAgICAvLyByaWdodCAtPSAxCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGZyYW1lX2J1cnkgMwogICAgYiBxdWlja3NvcnRfd2luZG93X3doaWxlX3RvcEA2CgpxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDIyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjQ3LTI0OAogICAgLy8gIyBzb3J0IGxlZnQgaGFsZiBvZiB3aW5kb3cKICAgIC8vIGlmIHdpbmRvd19sZWZ0IDwgcmlnaHQ6CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBxdWlja3NvcnRfd2luZG93X2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI0OQogICAgLy8gcXVpY2tzb3J0X3dpbmRvdyhhcnIsIHdpbmRvd19sZWZ0LCByaWdodCkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMwogICAgY2FsbHN1YiBxdWlja3NvcnRfd2luZG93CgpxdWlja3NvcnRfd2luZG93X2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNTAtMjUxCiAgICAvLyAjIHNvcnQgcmlnaHQgaGFsZiBvZiB3aW5kb3cKICAgIC8vIGlmIGxlZnQgPCB3aW5kb3dfcmlnaHQ6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiBxdWlja3NvcnRfd2luZG93X2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1MgogICAgLy8gcXVpY2tzb3J0X3dpbmRvdyhhcnIsIGxlZnQsIHdpbmRvd19yaWdodCkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBxdWlja3NvcnRfd2luZG93CgpxdWlja3NvcnRfd2luZG93X2FmdGVyX2lmX2Vsc2VAMjY6CiAgICByZXRzdWIKCnF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfd2hpbGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMjEtMjIyCiAgICAvLyAjIGlmIHdpbmRvdyBpc24ndCBlbXB0eSB0aGVuIHN3YXAgdmFsdWVzIGFuZCBtb3ZlIHdpbmRvdyBpbgogICAgLy8gaWYgbGVmdCA8IHJpZ2h0OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBxdWlja3NvcnRfd2luZG93X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIyMwogICAgLy8gYXJyW2xlZnRdLCBhcnJbcmlnaHRdID0gYXJyW3JpZ2h0XSwgYXJyW2xlZnRdCiAgICBmcmFtZV9kaWcgLTMKICAgIGxvYWRzCiAgICBkdXAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBjb3ZlciAzCiAgICByZXBsYWNlMyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGNvdmVyIDIKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0zCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIyNAogICAgLy8gbGVmdCArPSAxCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjI1LTIyNgogICAgLy8gIyBicmVhayBvdXQgb2YgbG9vcCBpZiByaWdodCB3b3VsZCBnbyBuZWdhdGl2ZQogICAgLy8gaWYgbm90IHJpZ2h0OgogICAgZnJhbWVfZGlnIDMKICAgIGJ6IHF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfd2hpbGVAMjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIyOAogICAgLy8gcmlnaHQgLT0gMQogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjI5LTIzMAogICAgLy8gIyBleHBsaWNpdCBjb250aW51ZSB0byBhdm9pZCBoaXR0aW5nIG91dGVyIGJyZWFrCiAgICAvLyBpZiBsZWZ0IDw9IHJpZ2h0OgogICAgZnJhbWVfZGlnIDQKICAgID49CiAgICBibnogcXVpY2tzb3J0X3dpbmRvd193aGlsZV90b3BAMwogICAgYiBxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDIyCgpxdWlja3NvcnRfd2luZG93X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMzUtMjM2CiAgICAvLyAjIGlmIHdpbmRvdyBpcyBqdXN0IG9uZSBpdGVtLCBkb24ndCBib3RoZXIgc3dhcHBpbmcsIGJ1dCBzdGlsbCBhZGp1c3Qgd2luZG93CiAgICAvLyBpZiBsZWZ0ID09IHJpZ2h0OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA9PQogICAgYnogcXVpY2tzb3J0X3dpbmRvd19hZnRlcl93aGlsZUAyMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjM3CiAgICAvLyBsZWZ0ICs9IDEKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMzgtMjM5CiAgICAvLyAjIGRvbid0IGRlY3JlbWVudCByaWdodCBpZiBpdCB3b3VsZCBnbyBuZWdhdGl2ZQogICAgLy8gaWYgcmlnaHQ6CiAgICBmcmFtZV9kaWcgMwogICAgYnogcXVpY2tzb3J0X3dpbmRvd19hZnRlcl93aGlsZUAyMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjQwCiAgICAvLyByaWdodCAtPSAxCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGZyYW1lX2J1cnkgMwogICAgYiBxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDIyCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuY3JlYXRlX2FycmF5KCkgLT4gdWludDY0OgpjcmVhdGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNTUtMjU2CiAgICAvLyBAc3Vicm91dGluZShpbmxpbmU9RmFsc2UpCiAgICAvLyBkZWYgY3JlYXRlX2FycmF5KCkgLT4gUmVmZXJlbmNlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjU3CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgZHVwCiAgICBieXRlY18wIC8vIDB4CiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18yIC8vIDAKCmNyZWF0ZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNTgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzMgLy8gNQogICAgPAogICAgYnogY3JlYXRlX2FycmF5X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNTkKICAgIC8vIGFyci5hcHBlbmQoaSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxvYWRzCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjU4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNyZWF0ZV9hcnJheV9mb3JfaGVhZGVyQDEKCmNyZWF0ZV9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI2MAogICAgLy8gcmV0dXJuIGFycgogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuYXNzZXJ0X2xhc3RfaXNfemVybyhhcnI6IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXJ0X2xhc3RfaXNfemVybzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI2My0yNjQKICAgIC8vIEBzdWJyb3V0aW5lKGlubGluZT1GYWxzZSkKICAgIC8vIGRlZiBhc3NlcnRfbGFzdF9pc196ZXJvKGFycjogUmVmZXJlbmNlQXJyYXlbVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjY1CiAgICAvLyBhc3NlcnQgYXJyW2Fyci5sZW5ndGggLSAxXSA9PSAwCiAgICBmcmFtZV9kaWcgLTEKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgICEKICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuYWRkX3goYXJyOiB1aW50NjQsIHg6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX3g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNzctMjc4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkZF94KGFycjogUmVmZXJlbmNlQXJyYXlbVUludDY0XSwgeDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNzkKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGludGNfMiAvLyAwCgphZGRfeF9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNzkKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIDwKICAgIGJ6IGFkZF94X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyODAKICAgIC8vIGFyci5hcHBlbmQoaSkKICAgIGZyYW1lX2RpZyAtMgogICAgbG9hZHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI3OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBhZGRfeF9mb3JfaGVhZGVyQDEKCmFkZF94X2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuKGFycjogdWludDY0KSAtPiB1aW50NjQ6CmFwcGVuZF9sZW5ndGhfYW5kX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI5MS0yOTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuKGFycjogUmVmZXJlbmNlQXJyYXlbVUludDY0XSkgLT4gUmVmZXJlbmNlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjkzCiAgICAvLyBhcnIuYXBwZW5kKGFyci5sZW5ndGgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI5NAogICAgLy8gcmV0dXJuIGFycgogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOQogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoNDIpKQogICAgcHVzaGludCA0MiAvLyA0MgogICAgaXRvYgogICAgZGlnIDEKICAgIHN3YXAKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjMKICAgIC8vIGFkZF94KGFyciwgVUludDY0KDUpKQogICAgZHVwCiAgICBpbnRjXzMgLy8gNQogICAgY2FsbHN1YiBhZGRfeAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDYKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjcKICAgIC8vIHBvcF94KGFyciwgeD1VSW50NjQoMyksIGV4cGVjdGVkPVVJbnQ2NCg0KSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyODUKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzIgLy8gMAoKdGVzdF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyODUKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UoeCk6CiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI3CiAgICAvLyBwb3BfeChhcnIsIHg9VUludDY0KDMpLCBleHBlY3RlZD1VSW50NjQoNCkpCiAgICBwdXNoaW50IDMgLy8gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjg1CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjg2CiAgICAvLyBwb3BwZWQgPSBhcnIucG9wKCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgLQogICAgZGlnIDIKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMgogICAgZXh0cmFjdDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjg3CiAgICAvLyBhc3NlcnQgcG9wcGVkID09IGV4cGVjdGVkCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyODgKICAgIC8vIGV4cGVjdGVkIC09IDEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBidXJ5IDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI4NQogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAzCiAgICBkaWcgMgogICAgZHVwCiAgICBsb2FkcwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTozMQogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoNDMpKQogICAgcHVzaGludCA0MyAvLyA0MwogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXAyCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjMyCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjMzCiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0MwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDMgLy8gNDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjM0CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDQyCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjM2CiAgICAvLyBhZGRfeChhcnIsIFVJbnQ2NCgxMCkpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGNhbGxzdWIgYWRkX3gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjM3CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxNAogICAgZHVwCiAgICBsb2FkcwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgMTQgLy8gMTQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjM4CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA5IC8vIDkKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjQwCiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCg0NCkpCiAgICBwdXNoaW50IDQ0IC8vIDQ0CiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjQxCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgMTUgLy8gMTUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjQyCiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0NAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDQgLy8gNDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI3MgogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoOTkpKQogICAgcHVzaGludCA5OSAvLyA5OQogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNzMKICAgIC8vIGFycjIuYXBwZW5kKFVJbnQ2NCgxMDApKQogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjQ0CiAgICAvLyByZXR1cm5fcmVmKGFyciwgYXJyKVswXSArPSAyCiAgICBkdXAKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBkaWcgMQogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo0NQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gMTcKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgZHVwCiAgICBwdXNoaW50IDE3IC8vIDE3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo0NgogICAgLy8gYXNzZXJ0IGFyclswXSA9PSA0NAogICAgZGlnIDEKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0NCAvLyA0NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NDcKICAgIC8vIGFzc2VydCBhcnJbLTJdID09IDk5CiAgICBkdXAKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZGlnIDIKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDk5IC8vIDk5CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo0OAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMTAwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYXJyYXlfZXh0ZW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9leHRlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1MgogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1MwogICAgLy8gYWRkX3goYXJyLCBVSW50NjQoMSkpCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1NwogICAgLy8gYXJyMi5hcHBlbmQoVUludDY0KDMpKQogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1OQogICAgLy8gYXJyLmV4dGVuZChhcnIyKQogICAgZHVwCiAgICBsb2FkcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NTcKICAgIC8vIGFycjIuYXBwZW5kKFVJbnQ2NCgzKSkKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjU5CiAgICAvLyBhcnIuZXh0ZW5kKGFycjIpCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGRpZyAxCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjYwCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9hcnJheV9tdWx0aXBsZV9hcHBlbmRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FycmF5X211bHRpcGxlX2FwcGVuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY0CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgZHVwCiAgICBieXRlY18wIC8vIDB4CiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY1CiAgICAvLyBhZGRfeChhcnIsIFVJbnQ2NCgxKSkKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgYWRkX3gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY2CiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCgxKSkKICAgIGR1cAogICAgbG9hZHMKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY3CiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCgyKSkKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY4CiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCgzKSkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGRpZyAxCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY5CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9hcnJheV90b29fbG9uZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJyYXlfdG9vX2xvbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo3NwogICAgLy8gYXJyYXkgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojc4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNTEyKToKICAgIGludGNfMiAvLyAwCgp0ZXN0X2FycmF5X3Rvb19sb25nX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojc4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNTEyKToKICAgIGR1cAogICAgaW50YyA0IC8vIDUxMgogICAgPAogICAgYnogdGVzdF9hcnJheV90b29fbG9uZ19hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NzkKICAgIC8vIGFycmF5LmFwcGVuZChpKQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NzgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1MTIpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FycmF5X3Rvb19sb25nX2Zvcl9oZWFkZXJAMgoKdGVzdF9hcnJheV90b29fbG9uZ19hZnRlcl9mb3JANToKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4MAogICAgLy8gYXNzZXJ0IGFycmF5Lmxlbmd0aCA9PSA1MTIsICJhcnJheSBpcyBleHBlY3RlZCBsZW5ndGgiCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGMgNCAvLyA1MTIKICAgID09CiAgICBhc3NlcnQgLy8gYXJyYXkgaXMgZXhwZWN0ZWQgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4MgogICAgLy8gYXJyYXkuYXBwZW5kKFVJbnQ2NCg1MTIpKSAgIyB0aGlzIHdpbGwgZmFpbAogICAgaW50YyA0IC8vIDUxMgogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9jb3B5X2FuZF9leHRlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4NgogICAgLy8gYXJyYXkgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojg3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzIgLy8gMAoKdGVzdF9hcnJheV9jb3B5X2FuZF9leHRlbmRfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6ODcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgaW50Y18zIC8vIDUKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4OAogICAgLy8gYXJyYXkuYXBwZW5kKGkpCiAgICBkdXAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4NwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FycmF5X2NvcHlfYW5kX2V4dGVuZF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6OTEKICAgIC8vIGFycmF5LmFwcGVuZChVSW50NjQoNSkpCiAgICBpbnRjXzMgLy8gNQogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo5MgogICAgLy8gYXNzZXJ0IGFycmF5Lmxlbmd0aCA9PSA2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjkzCiAgICAvLyBhc3NlcnQgYXJyYXlbLTFdID09IDUsICJleHBlY3RlZCA1IgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDUKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo5NQogICAgLy8gYXNzZXJ0IGFycmF5Mi5sZW5ndGggPT0gNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBkdXAKICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo5NgogICAgLy8gYXNzZXJ0IGFycmF5MlstMV0gPT0gNCwgImV4cGVjdGVkIDQiCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6OTgKICAgIC8vIGFycmF5LmV4dGVuZChhcnJheTIpCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojk5CiAgICAvLyBhc3NlcnQgYXJyYXkubGVuZ3RoID09IDExCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGR1cAogICAgcHVzaGludCAxMSAvLyAxMQogICAgPT0KICAgIGFzc2VydAogICAgdW5jb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMDAKICAgIC8vIGFzc2VydCBhcnJheTIubGVuZ3RoID09IDUKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMDEKICAgIC8vIGFzc2VydCBhcnJheVstMV0gPT0gNCwgImV4cGVjdGVkIDQiCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTAyCiAgICAvLyBhc3NlcnQgYXJyYXlbNF0gPT0gNCwgImV4cGVjdGVkIDQiCiAgICBkdXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMDMKICAgIC8vIGFzc2VydCBhcnJheVs1XSA9PSA1LCAiZXhwZWN0ZWQgNCIKICAgIGR1cAogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEwNAogICAgLy8gYXNzZXJ0IGFycmF5WzZdID09IDAsICJleHBlY3RlZCA0IgogICAgcHVzaGludCA0OCAvLyA0OAogICAgZXh0cmFjdF91aW50NjQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X2FycmF5X2V2YWx1YXRpb25fb3JkZXJbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FycmF5X2V2YWx1YXRpb25fb3JkZXI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMDgKICAgIC8vIGFyciA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMDkKICAgIC8vIGFyci5hcHBlbmQoVUludDY0KDMpKQogICAgcHVzaGludCAzIC8vIDMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjExMAogICAgLy8gYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuKGFycikuZXh0ZW5kKGFwcGVuZF9sZW5ndGhfYW5kX3JldHVybihhcnIpKQogICAgZHVwCiAgICBjYWxsc3ViIGFwcGVuZF9sZW5ndGhfYW5kX3JldHVybgogICAgZGlnIDEKICAgIGNhbGxzdWIgYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuCiAgICBsb2FkcwogICAgZGlnIDEKICAgIGxvYWRzCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTExCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA2CiAgICBkdXAKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTIKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMwogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTMKICAgIC8vIGFzc2VydCBhcnJbMV0gPT0gMQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTQKICAgIC8vIGFzc2VydCBhcnJbMl0gPT0gMgogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjExNQogICAgLy8gYXNzZXJ0IGFyclszXSA9PSAzCiAgICBkdXAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTE2CiAgICAvLyBhc3NlcnQgYXJyWzRdID09IDEKICAgIGR1cAogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTcKICAgIC8vIGFzc2VydCBhcnJbNV0gPT0gMgogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTkKICAgIC8vIGFyclthcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4oYXJyKVswXV0gPSBhcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4oYXJyKVstMV0KICAgIGR1cAogICAgY2FsbHN1YiBhcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4KICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIGNhbGxzdWIgYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuCiAgICBsb2FkcwogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgbG9hZHMKICAgIHN3YXAKICAgIGludGNfMCAvLyA4CiAgICAqCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZGlnIDEKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTIwCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMjEKICAgIC8vIGFzc2VydCBhcnJbNl0gPT0gNgogICAgZHVwCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEyMgogICAgLy8gYXNzZXJ0IGFycls3XSA9PSA3CiAgICBkdXAKICAgIHB1c2hpbnQgNTYgLy8gNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDcgLy8gNwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTIzCiAgICAvLyBhc3NlcnQgYXJyWzNdID09IDYKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYXJyYXlfYXNzaWdubWVudF9tYXhpbXVtX2N1cnNhZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FycmF5X2Fzc2lnbm1lbnRfbWF4aW11bV9jdXJzYWdlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTI3CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTI4CiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCgzKSkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICBkaWcgMQogICAgc3dhcAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMjkKICAgIC8vIGFwcGVuZF9sZW5ndGhfYW5kX3JldHVybihhcnIpWzBdID0gVUludDY0KDQyKQogICAgZHVwCiAgICBjYWxsc3ViIGFwcGVuZF9sZW5ndGhfYW5kX3JldHVybgogICAgcHVzaGludCA0MiAvLyA0MgogICAgaXRvYgogICAgZGlnIDEKICAgIGxvYWRzCiAgICBzd2FwCiAgICByZXBsYWNlMiAwIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDIKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzEKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gNDIKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzIKICAgIC8vIGFzc2VydCBhcnJbMV0gPT0gMQogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYWxsb2NhdGlvbnNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FsbG9jYXRpb25zOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG51bSk6CiAgICBpbnRjXzIgLy8gMAoKdGVzdF9hbGxvY2F0aW9uc19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzYKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UobnVtKToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfYWxsb2NhdGlvbnNfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEzNwogICAgLy8gYWxsb2NfdGVzdCA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM4CiAgICAvLyBhZGRfeChhbGxvY190ZXN0LCBVSW50NjQoMSkpCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBhZGRfeAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG51bSk6CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hbGxvY2F0aW9uc19mb3JfaGVhZGVyQDIKCnRlc3RfYWxsb2NhdGlvbnNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9pdGVyYXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2l0ZXJhdGlvbjoKICAgIGludGNfMiAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0MgogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBkdXBuIDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0MwogICAgLy8gZm9yIHZhbCBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzIgLy8gMAoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQzCiAgICAvLyBmb3IgdmFsIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgaW50Y18zIC8vIDUKICAgIDwKICAgIGJ6IHRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDQKICAgIC8vIGFyci5hcHBlbmQodmFsKQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQzCiAgICAvLyBmb3IgdmFsIGluIHVyYW5nZSg1KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAyCgp0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JANToKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUsICJleHBlY3RlZCBhcnJheSBvZiBsZW5ndGggNSIKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGR1cAogICAgYnVyeSAxMAogICAgaW50Y18zIC8vIDUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXkgb2YgbGVuZ3RoIDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0Ny0xNDgKICAgIC8vICMgaXRlcmF0ZQogICAgLy8gbGFzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNAogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQ5CiAgICAvLyBmb3IgdmFsdWUgaW4gYXJyOgogICAgZGlnIDQKICAgIGRpZyA5CiAgICA8CiAgICBieiB0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAOQogICAgZGlnIDEKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTUwCiAgICAvLyBhc3NlcnQgdmFsdWUgPj0gbGFzdCwgImFycmF5IGlzIG5vdCBzb3J0ZWQiCiAgICBkdXAKICAgIGRpZyA2CiAgICA+PQogICAgYXNzZXJ0IC8vIGFycmF5IGlzIG5vdCBzb3J0ZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKICAgIGJ1cnkgNAogICAgYiB0ZXN0X2l0ZXJhdGlvbl9mb3JfaGVhZGVyQDYKCnRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckA5OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE1My0xNTQKICAgIC8vICMgZW51bWVyYXRlCiAgICAvLyBmb3IgaWR4LCB2YWx1ZSBpbiB1ZW51bWVyYXRlKGFycik6CiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBidXJ5IDgKICAgIGludGNfMiAvLyAwCiAgICBidXJ5IDYKCnRlc3RfaXRlcmF0aW9uX2Zvcl9oZWFkZXJAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNTMtMTU0CiAgICAvLyAjIGVudW1lcmF0ZQogICAgLy8gZm9yIGlkeCwgdmFsdWUgaW4gdWVudW1lcmF0ZShhcnIpOgogICAgZGlnIDUKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAMTMKICAgIGRpZyAxCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE1NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGlkeCwgImluY29ycmVjdCBhcnJheSB2YWx1ZSIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGluY29ycmVjdCBhcnJheSB2YWx1ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNgogICAgYiB0ZXN0X2l0ZXJhdGlvbl9mb3JfaGVhZGVyQDEwCgp0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAMTM6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTU3LTE1OAogICAgLy8gIyByZXZlcnNlCiAgICAvLyBmb3IgdmFsdWUgaW4gcmV2ZXJzZWQoYXJyKToKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGJ1cnkgMwoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE1Ny0xNTgKICAgIC8vICMgcmV2ZXJzZQogICAgLy8gZm9yIHZhbHVlIGluIHJldmVyc2VkKGFycik6CiAgICBkaWcgMgogICAgYnogdGVzdF9pdGVyYXRpb25fYWZ0ZXJfZm9yQDE3CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgYnVyeSA0CiAgICBkaWcgMgogICAgc3dhcAogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNTkKICAgIC8vIGFzc2VydCB2YWx1ZSA8PSBsYXN0LCAiYXJyYXkgaXMgbm90IHNvcnRlZCIKICAgIGR1cAogICAgZGlnIDUKICAgIDw9CiAgICBhc3NlcnQgLy8gYXJyYXkgaXMgbm90IHNvcnRlZAogICAgYnVyeSA0CiAgICBiIHRlc3RfaXRlcmF0aW9uX2Zvcl9oZWFkZXJAMTQKCnRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2MgogICAgLy8gYXJjNF9hcnIgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0oKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQyCiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGJ1cnkgMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2NAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNwoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAxODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2NAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZGlnIDYKICAgIGludGNfMyAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAMjEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2NQogICAgLy8gYXJjNF9hcnIuYXBwZW5kKGFyYzQuVUludDY0KGkpKQogICAgZGlnIDYKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDEyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMTMKICAgIGRpZyAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY2CiAgICAvLyBuYXRpdmVfYXJyLmFwcGVuZChhcmM0LlVJbnQ2NChpKSkKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY0CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA3CiAgICBiIHRlc3RfaXRlcmF0aW9uX2Zvcl9oZWFkZXJAMTgKCnRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckAyMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2NwogICAgLy8gY29tYmluZWRfYXJyID0gYXJjNF9hcnIgKyBuYXRpdmVfYXJyCiAgICBkaWcgMTAKICAgIGRpZyAxMAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY4CiAgICAvLyBhc3NlcnQgY29tYmluZWRfYXJyLmxlbmd0aCA9PSAxMAogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMCAvLyAxMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY5CiAgICAvLyBhc3NlcnQgY29tYmluZWRfYXJyWzBdID09IDAKICAgIGR1cAogICAgZXh0cmFjdCAyIDgKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTcwCiAgICAvLyBhc3NlcnQgY29tYmluZWRfYXJyWzRdID09IDQKICAgIGR1cAogICAgZXh0cmFjdCAzNCA4CiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwNAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGNvbWJpbmVkX2Fycls1XSA9PSAwCiAgICBkdXAKICAgIGV4dHJhY3QgNDIgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNzIKICAgIC8vIGFzc2VydCBjb21iaW5lZF9hcnJbOV0gPT0gNAogICAgZXh0cmFjdCA3NCA4CiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwNAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X3F1aWNrc29ydFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcXVpY2tzb3J0OgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNzYtMTc3CiAgICAvLyAjIGNyZWF0ZSBwc2V1ZG8gcmFuZG9tIGFycmF5IGZyb20gc2VuZGVyIGFkZHJlc3MKICAgIC8vIHJuZCA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTc4CiAgICAvLyBmb3IgYiBpbiBUeG4uc2VuZGVyLmJ5dGVzOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18yIC8vIDAKCnRlc3RfcXVpY2tzb3J0X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3OAogICAgLy8gZm9yIGIgaW4gVHhuLnNlbmRlci5ieXRlczoKICAgIGR1cAogICAgcHVzaGludCAzMiAvLyAzMgogICAgPAogICAgYnogdGVzdF9xdWlja3NvcnRfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3OQogICAgLy8gcm5kLmFwcGVuZChvcC5idG9pKGIpKQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRieXRlCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsb2FkcwogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzdG9yZXMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9xdWlja3NvcnRfZm9yX2hlYWRlckAyCgp0ZXN0X3F1aWNrc29ydF9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE4MAogICAgLy8gYXNzZXJ0IHJuZC5sZW5ndGggPT0gMzIsICJleHBlY3RlZCBhcnJheSBvZiBsZW5ndGggMzIiCiAgICBkaWcgMgogICAgZHVwCiAgICBsb2FkcwogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgZHVwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFycmF5IG9mIGxlbmd0aCAzMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTgyLTE4MwogICAgLy8gIyBzb3J0IHRoZSBhcnJheQogICAgLy8gcXVpY2tzb3J0X3dpbmRvdyhybmQsIFVJbnQ2NCgwKSwgcm5kLmxlbmd0aCAtIDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgcXVpY2tzb3J0X3dpbmRvdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTg1LTE4NgogICAgLy8gIyBhcnJheSBzaG91bGQgbm93IGJlIGluIGFzY2VuZGluZyBvcmRlcgogICAgLy8gbGFzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTg3CiAgICAvLyBmb3IgdmFsdWUgaW4gcm5kOgogICAgbG9hZHMKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGJ1cnkgNgogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9xdWlja3NvcnRfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTg3CiAgICAvLyBmb3IgdmFsdWUgaW4gcm5kOgogICAgZGlnIDQKICAgIGRpZyA2CiAgICA8CiAgICBieiB0ZXN0X3F1aWNrc29ydF9hZnRlcl9mb3JAOQogICAgZGlnIDIKICAgIGxvYWRzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE4OAogICAgLy8gYXNzZXJ0IHZhbHVlID49IGxhc3QsICJhcnJheSBpcyBub3Qgc29ydGVkIgogICAgZHVwCiAgICBkaWcgNgogICAgPj0KICAgIGFzc2VydCAvLyBhcnJheSBpcyBub3Qgc29ydGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBidXJ5IDQKICAgIGIgdGVzdF9xdWlja3NvcnRfZm9yX2hlYWRlckA2Cgp0ZXN0X3F1aWNrc29ydF9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X3Vub2JzZXJ2ZWRfd3JpdGVbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3Vub2JzZXJ2ZWRfd3JpdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTMKICAgIC8vIGFyciA9IGNyZWF0ZV9hcnJheSgpCiAgICBjYWxsc3ViIGNyZWF0ZV9hcnJheQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTk0CiAgICAvLyBsYXN0ID0gYXJyLmxlbmd0aCAtIDEKICAgIGR1cAogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE5NQogICAgLy8gYXJyW2xhc3RdID0gVUludDY0KDApICAjIHdyaXRlCiAgICBpbnRjXzIgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgaW50Y18wIC8vIDgKICAgICoKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgc3dhcAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTYKICAgIC8vIGFzc2VydF9sYXN0X2lzX3plcm8oYXJyKQogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X2xhc3RfaXNfemVybwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTk3CiAgICAvLyBhcnJbbGFzdF0gPSBVSW50NjQoMSkgICMgd3JpdGUKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBkaWcgMgogICAgbG9hZHMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTgKICAgIC8vIGFzc2VydCBhcnJbbGFzdF0gPT0gMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLm1lbS5uZXdfc2xvdCgpIC0+IHVpbnQ2NDoKX3B1eWFfbGliLm1lbS5uZXdfc2xvdDoKICAgIGxvYWQgMAogICAgYml0bGVuCiAgICBsb2FkIDAKICAgIHB1c2hpbnQgMjU2IC8vIDI1NgogICAgZGlnIDIKICAgIC0KICAgIGludGNfMiAvLyAwCiAgICBzZXRiaXQgLy8gb24gZXJyb3I6IG5vIGF2YWlsYWJsZSBzbG90cwogICAgc3RvcmUgMAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyAFCAEABYAEJgQAGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAwgAAAAAAAAAAAgAAAAAAAAABIAgf/////////////////////////////////////////81ADEbQQBlMRkURDEYRIIMBKM76HME4MN46QQ2b1CdBFg1GlAE+pnphASiDkQPBBeaw/kERdzINgTxf28KBIReG04EdiHP0QRWYaZ8NhoAjgwBSAJOAmoAAQKNArYDLwPAA+0EDQUSBYEAI0MxGRQxGBQQQ4oDAChJi/6L/wiBAgqL/T5MIgtbi/+L/ov9PosEIgtJjABbiwIMQQAJiwQjCIwEQv/mi/0+iwMiC0mMAVuLAg1BADGLA0EACYsDIwmMA0L/4Yv+iwMMQQAJi/2L/osDiP+eiwSL/wxBAAmL/YsEi/+I/42JiwSLAwxBADmL/T5JiwFJTgMiWEsBiwBJTgMiWE4DXU4CXYv9TD+LBCMIjASLA0H/rIsDIwlJjAOLBA9A/2ZC/5yLBIsDEkH/lIsEIwiMBIsDQf+JiwMjCYwDQv+AigABiATTSSg/JIsBJQxBABOLAEk+iwFJTgMWUD8jCIwBQv/miYoBAIv/PkkVIgojCSILWxREiYoCACSLAIv/DEEAFYv+PosASU4CFlCL/kw/IwiMAEL/44mKAQGL/z5JFSIKFlCL/0w/i/+JiARqSYEqFksBTD9JJYj/uz5JFSIKSYEGEkQjCSILW4EEEkSBBCRJgQMMQQAtSwJJPkkVSSIJSwIkSwJYTwNPAk8DUhdOAj9LAklOAhJEIwlFAkkjCEUBQv/MSwJJPkkVIgpJgQMSRCMJIgtLAUxbIxJEgSsWUEo/SRUiCkmBBBJEIwkiC0sBTFuBKxJEJFuBKhJESYEKiP8yST5JFSIKSYEOEkQjCSILSwFMW4EJEkSBLBZQSRUiCkmBDxJEIwkiC0sBTFuBLBJEgWMWUIFkFlBJJFuBAggWXABMSwE/SRUiCkmBERJESwEkW4EsEkRJgQIJIgtLAkxbgWMSRCMJIgtbgWQSQ4gDZEkoP0kjiP66KUhJPilQTEsBPxUiCoEEEkOIA0hJKD9JI4j+nkk+IxZQgQIWUIEDFlBMSwE/FSIKgQQSQygkSSEEDEEAD0pJTgIWUEUDIwhFAUL/6ksBSRUiCiEEEkQhBBZQSCNDKCRJJQxBAA9KSU4CFlBFAyMIRQFC/+tLAUklFlBJFSIKSYEGEkQjCSILSwFMWyUSREsBSRUiCkklEkQjCSILSwFMW4EEEkRQSRUiCkmBCxJETwIVIgolEkQjCSILSwFMW4EEEkRJgSBbgQQSREmBKFslEkSBMFsUQ4gCg4EDFksBTD9JiP34SwGI/fM+SwE+TFA/ST5JFSIKgQYSREkkW4EDEkRJIlsjEkRJgRBbgQISREmBGFuBAxJESYEgWyMSRIEoW4ECEkRJiP2zPkkVIgojCSILIlhLAYj9oz4kW0sCPkwiC08CXUxLAT9JFSIKIhJESYEwW4EGEkRJgThbgQcSRIEYW4EGEkOIAfKBAxZLAUw/SYj9Z4EqFksBPkxcAD8+SRUiCoECEkRJJFuBKhJEIlsjEkM2GgEXJElLAgxBABKIAblJKD8jiP0QSSMIRQFC/+cjQyRJKEcHJEklDEEAD0pJTgIWUEUDIwhFAUL/60sBFSIKSUUKJRJEJEUEJEUFSwRLCQxBABlLAUsFSU4CIgtbSUsGD0RMIwhFBkUEQv/fSwEVIgpFCCRFBksFSwgMQQAVSwFLBklOAiILW0sBEkQjCEUGQv/jSwEVIgpFA0sCQQAXSwIjCUlFBEsCTCILW0lLBQ5ERQRC/+SAAgAARQsoRQokRQdLBiUMQQAnSwZJFksMSU4CSwFQTwIkWSMIFlcGAlwARQ1LC0xQRQsjCEUHQv/SSwpLClBJVwIAFSIKFlcGAlwASSRZgQoSRElXAggqqERJVyIIK6hESVcqCCqoRFdKCCuoQyhHAogAnUkoPzEAJEmBIAxBABZKSU4CVUsESU4CPkwWUD8jCEUBQv/jSwJJPhUiCkmBIBJEIwlLASRPAoj6uiRFBT4VIgpFBiRFBUsESwYMQQAaSwI+SwVJTgIiC1tJSwYPREwjCEUGRQRC/94jQ4j7WEk+SRUiCiMJJBZMIgtPAksBTwNdSwJMP0sBiPtgIxZLAj5LAk8CXU8CSwE/TFsjEkM0AJM0AIGAAksCCSRUNQCJ", + "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==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal b/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal index 8953a0b..09ddd80 100644 --- a/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal +++ b/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal @@ -5,7 +5,7 @@ main: intcblock 8 3 1 0 bytecblock 0x000000000000000100000000000000020000000000000003 - // tests/artifacts/Arrays/immutable.py:479 + // tests/artifacts/Arrays/immutable.py:480 // class DynamicArrayInitContract(arc4.ARC4Contract): txn NumAppArgs bz main___algopy_default_create@11 @@ -25,16 +25,18 @@ main___algopy_default_create@11: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + 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:490 + // 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:480 + // tests/artifacts/Arrays/immutable.py:481 // @arc4.abimethod() intc_2 // 1 return @@ -42,11 +44,11 @@ test_immutable_array_init: // 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:512 + // tests/artifacts/Arrays/immutable.py:513 // a3 = ImmutableArray(ReferenceArray((UInt64(1), UInt64(2), UInt64(3)))) bytec_0 // 0x000000000000000100000000000000020000000000000003 pop - // tests/artifacts/Arrays/immutable.py:502 + // tests/artifacts/Arrays/immutable.py:503 // @arc4.abimethod() intc_2 // 1 return @@ -54,15 +56,15 @@ test_immutable_array_init_without_type_generic: // tests.artifacts.Arrays.immutable.DynamicArrayInitContract.test_reference_array_init[routing]() -> void: test_reference_array_init: - // tests/artifacts/Arrays/immutable.py:526 + // tests/artifacts/Arrays/immutable.py:527 // a1 = ReferenceArray[UInt64]((UInt64(1), UInt64(2), UInt64(3))) bytec_0 // 0x000000000000000100000000000000020000000000000003 - // tests/artifacts/Arrays/immutable.py:528 + // 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:529 + // tests/artifacts/Arrays/immutable.py:530 // assert a1.length == a2.length len intc_0 // 8 @@ -70,7 +72,7 @@ test_reference_array_init: intc_1 // 3 == assert - // tests/artifacts/Arrays/immutable.py:530 + // tests/artifacts/Arrays/immutable.py:531 // assert a1[0] == a2[0] dup intc_3 // 0 @@ -78,7 +80,7 @@ test_reference_array_init: intc_2 // 1 == assert - // tests/artifacts/Arrays/immutable.py:531 + // tests/artifacts/Arrays/immutable.py:532 // assert a1[1] == a2[1] dup intc_0 // 8 @@ -86,26 +88,26 @@ test_reference_array_init: pushint 2 // 2 == assert - // tests/artifacts/Arrays/immutable.py:532 + // tests/artifacts/Arrays/immutable.py:533 // assert a1[2] == a2[2] pushint 16 // 16 extract_uint64 intc_1 // 3 == assert - // tests/artifacts/Arrays/immutable.py:534 + // 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:536 + // tests/artifacts/Arrays/immutable.py:537 // assert a1[0] == a3[0] intc_3 // 0 extract_uint64 intc_2 // 1 == assert - // tests/artifacts/Arrays/immutable.py:537 + // tests/artifacts/Arrays/immutable.py:538 // assert a1[1] == a3[1] dup intc_0 // 8 @@ -113,20 +115,20 @@ test_reference_array_init: pushint 2 // 2 == assert - // tests/artifacts/Arrays/immutable.py:538 + // tests/artifacts/Arrays/immutable.py:539 // assert a1[2] == a3[2] pushint 16 // 16 extract_uint64 intc_1 // 3 == assert - // tests/artifacts/Arrays/immutable.py:526 + // 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:541 + // tests/artifacts/Arrays/immutable.py:542 // assert a1.length == a4.length dup len @@ -135,7 +137,7 @@ test_reference_array_init: intc_1 // 3 == assert - // tests/artifacts/Arrays/immutable.py:542 + // tests/artifacts/Arrays/immutable.py:543 // assert a1[0] == a4[0] dup intc_3 // 0 @@ -143,7 +145,7 @@ test_reference_array_init: intc_2 // 1 == assert - // tests/artifacts/Arrays/immutable.py:543 + // tests/artifacts/Arrays/immutable.py:544 // assert a1[1] == a4[1] dup intc_0 // 8 @@ -151,28 +153,28 @@ test_reference_array_init: pushint 2 // 2 == assert - // tests/artifacts/Arrays/immutable.py:544 + // tests/artifacts/Arrays/immutable.py:545 // assert a1[2] == a4[2] pushint 16 // 16 extract_uint64 intc_1 // 3 == - // tests/artifacts/Arrays/immutable.py:524 + // tests/artifacts/Arrays/immutable.py:525 // @arc4.abimethod() return // tests.artifacts.Arrays.immutable.DynamicArrayInitContract.test_reference_array_init_without_type_generic[routing]() -> void: test_reference_array_init_without_type_generic: - // tests/artifacts/Arrays/immutable.py:548 + // tests/artifacts/Arrays/immutable.py:549 // a1 = ReferenceArray((UInt64(1), UInt64(2), UInt64(3))) bytec_0 // 0x000000000000000100000000000000020000000000000003 - // tests/artifacts/Arrays/immutable.py:550 + // tests/artifacts/Arrays/immutable.py:551 // a2 = ReferenceArray(FixedArray((UInt64(1), UInt64(2), UInt64(3)))) dup pop dupn 2 - // tests/artifacts/Arrays/immutable.py:551 + // tests/artifacts/Arrays/immutable.py:552 // assert a1.length == a2.length len intc_0 // 8 @@ -180,7 +182,7 @@ test_reference_array_init_without_type_generic: intc_1 // 3 == assert - // tests/artifacts/Arrays/immutable.py:552 + // tests/artifacts/Arrays/immutable.py:553 // assert a1[0] == a2[0] dup intc_3 // 0 @@ -188,7 +190,7 @@ test_reference_array_init_without_type_generic: intc_2 // 1 == assert - // tests/artifacts/Arrays/immutable.py:553 + // tests/artifacts/Arrays/immutable.py:554 // assert a1[1] == a2[1] dup intc_0 // 8 @@ -196,26 +198,26 @@ test_reference_array_init_without_type_generic: pushint 2 // 2 == assert - // tests/artifacts/Arrays/immutable.py:554 + // tests/artifacts/Arrays/immutable.py:555 // assert a1[2] == a2[2] pushint 16 // 16 extract_uint64 intc_1 // 3 == assert - // tests/artifacts/Arrays/immutable.py:556 + // 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:558 + // tests/artifacts/Arrays/immutable.py:559 // assert a1[0] == a3[0] intc_3 // 0 extract_uint64 intc_2 // 1 == assert - // tests/artifacts/Arrays/immutable.py:559 + // tests/artifacts/Arrays/immutable.py:560 // assert a1[1] == a3[1] dup intc_0 // 8 @@ -223,20 +225,20 @@ test_reference_array_init_without_type_generic: pushint 2 // 2 == assert - // tests/artifacts/Arrays/immutable.py:560 + // tests/artifacts/Arrays/immutable.py:561 // assert a1[2] == a3[2] pushint 16 // 16 extract_uint64 intc_1 // 3 == assert - // tests/artifacts/Arrays/immutable.py:548 + // 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:563 + // tests/artifacts/Arrays/immutable.py:564 // assert a1.length == a4.length dup len @@ -245,7 +247,7 @@ test_reference_array_init_without_type_generic: intc_1 // 3 == assert - // tests/artifacts/Arrays/immutable.py:564 + // tests/artifacts/Arrays/immutable.py:565 // assert a1[0] == a4[0] dup intc_3 // 0 @@ -253,7 +255,7 @@ test_reference_array_init_without_type_generic: intc_2 // 1 == assert - // tests/artifacts/Arrays/immutable.py:565 + // tests/artifacts/Arrays/immutable.py:566 // assert a1[1] == a4[1] dup intc_0 // 8 @@ -261,12 +263,12 @@ test_reference_array_init_without_type_generic: pushint 2 // 2 == assert - // tests/artifacts/Arrays/immutable.py:566 + // tests/artifacts/Arrays/immutable.py:567 // assert a1[2] == a4[2] pushint 16 // 16 extract_uint64 intc_1 // 3 == - // tests/artifacts/Arrays/immutable.py:546 + // tests/artifacts/Arrays/immutable.py:547 // @arc4.abimethod() return diff --git a/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json b/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json index 54b8538..821869c 100644 --- a/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json +++ b/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json @@ -124,19 +124,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDMgMSAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzkKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUluaXRDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4NDM0YmEyYSAweDYzYWFiYmEwIDB4ZGJhZjAzNGUgMHhhOWQxNDU1NCAvLyBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQoKXZvaWQiLCBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMoKXZvaWQiLCBtZXRob2QgInRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXQoKXZvaWQiLCBtZXRob2QgInRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0IHRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMgdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdCB0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTE6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0OTAKICAgIC8vIGEzID0gSW1tdXRhYmxlQXJyYXlbVUludDY0XShSZWZlcmVuY2VBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuRHluYW1pY0FycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTEyCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5KFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjYKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjgKICAgIC8vIGEyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XShGaXhlZEFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBkdXAKICAgIHBvcAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjkKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTIubGVuZ3RoCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTMwCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTMxCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTMyCiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTJbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTM0CiAgICAvLyBhMyA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oSW1tdXRhYmxlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzYKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhM1swXQogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTM3CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTNbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTM4CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTNbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTI2CiAgICAvLyBhMSA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0MQogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhNC5sZW5ndGgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0MgogICAgLy8gYXNzZXJ0IGExWzBdID09IGE0WzBdCiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0MwogICAgLy8gYXNzZXJ0IGExWzFdID09IGE0WzFdCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NAogICAgLy8gYXNzZXJ0IGExWzJdID09IGE0WzJdCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NDgKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUwCiAgICAvLyBhMiA9IFJlZmVyZW5jZUFycmF5KEZpeGVkQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGR1cAogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1MQogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTIKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhMlswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTMKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhMlsxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTQKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTYKICAgIC8vIGEzID0gUmVmZXJlbmNlQXJyYXkoSW1tdXRhYmxlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTgKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhM1swXQogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU5CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTNbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTYwCiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTNbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ4CiAgICAvLyBhMSA9IFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjMKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTQubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjQKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhNFswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjUKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhNFsxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjYKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhNFsyXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDMgMSAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODAKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUluaXRDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4NDM0YmEyYSAweDYzYWFiYmEwIDB4ZGJhZjAzNGUgMHhhOWQxNDU1NCAvLyBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQoKXZvaWQiLCBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMoKXZvaWQiLCBtZXRob2QgInRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXQoKXZvaWQiLCBtZXRob2QgInRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0IHRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMgdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdCB0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTE6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkR5bmFtaWNBcnJheUluaXRDb250cmFjdC50ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ5MQogICAgLy8gYTMgPSBJbW11dGFibGVBcnJheVtVSW50NjRdKFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MTMKICAgIC8vIGEzID0gSW1tdXRhYmxlQXJyYXkoUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkR5bmFtaWNBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNwogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOQogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKEZpeGVkQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGR1cAogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMAogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzEKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhMlswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzIKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhMlsxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzMKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzUKICAgIC8vIGEzID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XShJbW11dGFibGVBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNwogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzkKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjcKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ1CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkR5bmFtaWNBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0OQogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTEKICAgIC8vIGEyID0gUmVmZXJlbmNlQXJyYXkoRml4ZWRBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgZHVwCiAgICBwb3AKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGEyLmxlbmd0aAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1MwogICAgLy8gYXNzZXJ0IGExWzBdID09IGEyWzBdCiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1NAogICAgLy8gYXNzZXJ0IGExWzFdID09IGEyWzFdCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGEyWzJdCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1NwogICAgLy8gYTMgPSBSZWZlcmVuY2VBcnJheShJbW11dGFibGVBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1OQogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjAKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjEKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NDkKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2NAogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhNC5sZW5ndGgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2NQogICAgLy8gYXNzZXJ0IGExWzBdID09IGE0WzBdCiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2NgogICAgLy8gYXNzZXJ0IGExWzFdID09IGE0WzFdCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2NwogICAgLy8gYXNzZXJ0IGExWzJdID09IGE0WzJdCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyAECAMBACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAA0AEQBjADEZFDEYFBBDKEgkQyhIJEMoSUhHAhUiCiMSREklWyQSREkiW4ECEkSBEFsjEkQoSEcCJVskEkRJIluBAhJEgRBbIxJEKEgoSEkVIgojEkRJJVskEkRJIluBAhJEgRBbIxJDKElIRwIVIgojEkRJJVskEkRJIluBAhJEgRBbIxJEKEhHAiVbJBJESSJbgQISRIEQWyMSRChIKEhJFSIKIxJESSVbJBJESSJbgQISRIEQWyMSQw==", + "approval": "CyAECAMBACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAALAA8AEwBlADEZFDEYFBBEJEMoSCRDKEgkQyhJSEcCFSIKIxJESSVbJBJESSJbgQISRIEQWyMSRChIRwIlWyQSREkiW4ECEkSBEFsjEkQoSChISRUiCiMSREklWyQSREkiW4ECEkSBEFsjEkMoSUhHAhUiCiMSREklWyQSREkiW4ECEkSBEFsjEkQoSEcCJVskEkRJIluBAhJEgRBbIxJEKEgoSEkVIgojEkRJJVskEkRJIluBAhJEgRBbIxJD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal b/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal index 08eb24a..a73a0b2 100644 --- a/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal +++ b/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal @@ -25,7 +25,9 @@ main___algopy_default_create@31: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_1 // 1 + return // _puya_lib.arc4.dynamic_array_pop_fixed_size(array: bytes, fixed_byte_size: uint64) -> bytes, bytes: @@ -382,23 +384,23 @@ dynamic_array_concat_dynamic_element_after_for@8: // tests.artifacts.Arrays.immutable.sum_imm_fixed(arr: bytes) -> uint64: sum_imm_fixed: - // tests/artifacts/Arrays/immutable.py:569-570 + // tests/artifacts/Arrays/immutable.py:570-571 // @subroutine // def sum_imm_fixed(arr: NativeStruct3) -> UInt64: proto 1 1 - // tests/artifacts/Arrays/immutable.py:571 + // tests/artifacts/Arrays/immutable.py:572 // total = UInt64(0) intc_0 // 0 dup sum_imm_fixed_for_header@1: - // tests/artifacts/Arrays/immutable.py:572 + // tests/artifacts/Arrays/immutable.py:573 // for item in arr: frame_dig 1 pushint 3 // 3 < bz sum_imm_fixed_after_for@4 - // tests/artifacts/Arrays/immutable.py:572-573 + // tests/artifacts/Arrays/immutable.py:573-574 // for item in arr: // total += item.foo frame_dig 1 @@ -409,19 +411,19 @@ sum_imm_fixed_for_header@1: swap pushint 16 // 16 extract3 // on error: index access is out of bounds - // tests/artifacts/Arrays/immutable.py:573 + // tests/artifacts/Arrays/immutable.py:574 // total += item.foo dup - // tests/artifacts/Arrays/immutable.py:572-573 + // tests/artifacts/Arrays/immutable.py:573-574 // for item in arr: // total += item.foo intc_0 // 0 - // tests/artifacts/Arrays/immutable.py:573 + // tests/artifacts/Arrays/immutable.py:574 // total += item.foo extract_uint64 frame_dig 0 + - // tests/artifacts/Arrays/immutable.py:574 + // tests/artifacts/Arrays/immutable.py:575 // total += item.bar swap intc_3 // 8 @@ -434,38 +436,38 @@ sum_imm_fixed_for_header@1: b sum_imm_fixed_for_header@1 sum_imm_fixed_after_for@4: - // tests/artifacts/Arrays/immutable.py:575 + // tests/artifacts/Arrays/immutable.py:576 // return total retsub // tests.artifacts.Arrays.immutable.times(n: uint64) -> bytes: times: - // tests/artifacts/Arrays/immutable.py:578-579 + // tests/artifacts/Arrays/immutable.py:579-580 // @subroutine // def times(n: UInt64) -> String: proto 1 1 - // tests/artifacts/Arrays/immutable.py:580 + // tests/artifacts/Arrays/immutable.py:581 // result = String() bytec_0 // "" - // tests/artifacts/Arrays/immutable.py:581 + // tests/artifacts/Arrays/immutable.py:582 // for _i in urange(n): intc_0 // 0 times_for_header@1: - // tests/artifacts/Arrays/immutable.py:581 + // tests/artifacts/Arrays/immutable.py:582 // for _i in urange(n): frame_dig 1 frame_dig -1 < bz times_after_for@4 - // tests/artifacts/Arrays/immutable.py:582 + // tests/artifacts/Arrays/immutable.py:583 // result += String(" ") frame_dig 0 pushbytes " " concat frame_bury 0 - // tests/artifacts/Arrays/immutable.py:581 + // tests/artifacts/Arrays/immutable.py:582 // for _i in urange(n): frame_dig 1 intc_1 // 1 @@ -474,29 +476,29 @@ times_for_header@1: b times_for_header@1 times_after_for@4: - // tests/artifacts/Arrays/immutable.py:583 + // tests/artifacts/Arrays/immutable.py:584 // return result retsub // tests.artifacts.Arrays.immutable.add_x(arr: bytes, x: uint64) -> bytes: add_x: - // tests/artifacts/Arrays/immutable.py:586-587 + // tests/artifacts/Arrays/immutable.py:587-588 // @subroutine // def add_x(arr: ImmutableArray[UInt64], x: UInt64) -> ImmutableArray[UInt64]: proto 2 1 - // tests/artifacts/Arrays/immutable.py:588 + // tests/artifacts/Arrays/immutable.py:589 // for i in urange(x): intc_0 // 0 add_x_for_header@1: - // tests/artifacts/Arrays/immutable.py:588 + // tests/artifacts/Arrays/immutable.py:589 // for i in urange(x): frame_dig 0 frame_dig -1 < bz add_x_after_for@4 - // tests/artifacts/Arrays/immutable.py:589 + // tests/artifacts/Arrays/immutable.py:590 // arr = arr.append(i) frame_dig 0 dup @@ -513,7 +515,7 @@ add_x_for_header@1: extract 6 2 replace2 0 frame_bury -2 - // tests/artifacts/Arrays/immutable.py:588 + // tests/artifacts/Arrays/immutable.py:589 // for i in urange(x): intc_1 // 1 + @@ -521,7 +523,7 @@ add_x_for_header@1: b add_x_for_header@1 add_x_after_for@4: - // tests/artifacts/Arrays/immutable.py:590 + // tests/artifacts/Arrays/immutable.py:591 // return arr frame_dig -2 swap @@ -541,7 +543,7 @@ test_uint64_array: // assert arr.length == 6 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup pushint 6 // 6 == @@ -577,7 +579,7 @@ test_uint64_array: // tests/artifacts/Arrays/immutable.py:108 // assert arr.length == 7 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup pushint 7 // 7 == @@ -602,29 +604,29 @@ test_uint64_array: pushint 42 // 42 == assert - // tests/artifacts/Arrays/immutable.py:595 + // tests/artifacts/Arrays/immutable.py:596 // for _i in urange(x): intc_0 // 0 test_uint64_array_for_header@2: - // tests/artifacts/Arrays/immutable.py:595 + // tests/artifacts/Arrays/immutable.py:596 // for _i in urange(x): dup // tests/artifacts/Arrays/immutable.py:112 // arr = pop_x(arr, UInt64(3)) pushint 3 // 3 - // tests/artifacts/Arrays/immutable.py:595 + // tests/artifacts/Arrays/immutable.py:596 // for _i in urange(x): < bz test_uint64_array_after_for@4 - // tests/artifacts/Arrays/immutable.py:596 + // tests/artifacts/Arrays/immutable.py:597 // arr = arr.pop() dig 1 intc_3 // 8 callsub dynamic_array_pop_fixed_size bury 3 pop - // tests/artifacts/Arrays/immutable.py:595 + // tests/artifacts/Arrays/immutable.py:596 // for _i in urange(x): dup intc_1 // 1 @@ -638,7 +640,7 @@ test_uint64_array_after_for@4: dig 1 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup pushint 4 // 4 == @@ -664,7 +666,7 @@ test_uint64_array_after_for@4: // assert arr.length == 14 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup pushint 14 // 14 == @@ -700,7 +702,7 @@ test_uint64_array_after_for@4: // assert arr.length == 15 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup pushint 15 // 15 == @@ -727,7 +729,7 @@ test_uint64_array_after_for@4: // assert arr.length == 15 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header pushint 15 // 15 == assert @@ -776,7 +778,7 @@ test_biguint_array: // tests/artifacts/Arrays/immutable.py:136 // assert arr.length == 1 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup intc_1 // 1 == @@ -795,22 +797,22 @@ test_biguint_array: bytec_0 // 0x b== assert - // tests/artifacts/Arrays/immutable.py:602 + // tests/artifacts/Arrays/immutable.py:603 // for i in urange(x): intc_0 // 0 test_biguint_array_for_header@2: - // tests/artifacts/Arrays/immutable.py:602 + // tests/artifacts/Arrays/immutable.py:603 // for i in urange(x): dup // tests/artifacts/Arrays/immutable.py:139 // arr = add_xb(arr, UInt64(5)) pushint 5 // 5 - // tests/artifacts/Arrays/immutable.py:602 + // tests/artifacts/Arrays/immutable.py:603 // for i in urange(x): < bz test_biguint_array_after_for@4 - // tests/artifacts/Arrays/immutable.py:603 + // tests/artifacts/Arrays/immutable.py:604 // arr = arr.append(BigUInt(i)) dupn 2 itob @@ -829,7 +831,7 @@ test_biguint_array_for_header@2: extract 6 2 replace2 0 bury 3 - // tests/artifacts/Arrays/immutable.py:602 + // tests/artifacts/Arrays/immutable.py:603 // for i in urange(x): intc_1 // 1 + @@ -842,7 +844,7 @@ test_biguint_array_after_for@4: dig 1 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup pushint 6 // 6 == @@ -889,7 +891,7 @@ test_biguint_array_after_for@4: // assert arr.length == 7 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup pushint 7 // 7 == @@ -931,7 +933,7 @@ test_biguint_array_after_for@4: // assert arr.length == 8 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup intc_3 // 8 == @@ -981,18 +983,18 @@ test_bool_array: // tests/artifacts/Arrays/immutable.py:157 // arr = ImmutableArray[bool]() bytec_2 // 0x0000 - // tests/artifacts/Arrays/immutable.py:160 + // tests/artifacts/Arrays/immutable.py:161 // for i in urange(length): intc_0 // 0 test_bool_array_for_header@2: - // tests/artifacts/Arrays/immutable.py:160 + // tests/artifacts/Arrays/immutable.py:161 // for i in urange(length): dup dig 3 < bz test_bool_array_after_for@5 - // tests/artifacts/Arrays/immutable.py:161 + // tests/artifacts/Arrays/immutable.py:162 // arr = arr.append(i == Txn.num_app_args) txn NumAppArgs dig 1 @@ -1009,7 +1011,7 @@ test_bool_array_for_header@2: intc_3 // 8 callsub dynamic_array_concat_bits bury 3 - // tests/artifacts/Arrays/immutable.py:160 + // tests/artifacts/Arrays/immutable.py:161 // for i in urange(length): intc_1 // 1 + @@ -1017,11 +1019,11 @@ test_bool_array_for_header@2: b test_bool_array_for_header@2 test_bool_array_after_for@5: - // tests/artifacts/Arrays/immutable.py:163 + // tests/artifacts/Arrays/immutable.py:164 // assert arr.length == length dig 1 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup bury 5 dig 3 @@ -1029,10 +1031,10 @@ test_bool_array_after_for@5: cover 2 == assert - // tests/artifacts/Arrays/immutable.py:165 + // tests/artifacts/Arrays/immutable.py:166 // if length > 0: bz test_bool_array_after_if_else@7 - // tests/artifacts/Arrays/immutable.py:166 + // tests/artifacts/Arrays/immutable.py:167 // assert not arr[0], "expected element 0 to be False" dig 3 assert // index access is out of bounds @@ -1043,13 +1045,13 @@ test_bool_array_after_for@5: assert // expected element 0 to be False test_bool_array_after_if_else@7: - // tests/artifacts/Arrays/immutable.py:167 + // tests/artifacts/Arrays/immutable.py:168 // if length > 1: dig 2 intc_1 // 1 > bz test_bool_array_after_if_else@9 - // tests/artifacts/Arrays/immutable.py:168 + // tests/artifacts/Arrays/immutable.py:169 // assert not arr[1], "expected element 1 to be False" intc_1 // 1 dig 4 @@ -1062,13 +1064,13 @@ test_bool_array_after_if_else@7: assert // expected element 1 to be False test_bool_array_after_if_else@9: - // tests/artifacts/Arrays/immutable.py:169 + // tests/artifacts/Arrays/immutable.py:170 // if length > 2: dig 2 intc_2 // 2 > bz test_bool_array_after_if_else@11 - // tests/artifacts/Arrays/immutable.py:170 + // tests/artifacts/Arrays/immutable.py:171 // assert arr[2], "expected element 2 to be True" intc_2 // 2 dig 4 @@ -1080,13 +1082,13 @@ test_bool_array_after_if_else@9: assert // expected element 2 to be True test_bool_array_after_if_else@11: - // tests/artifacts/Arrays/immutable.py:171 + // tests/artifacts/Arrays/immutable.py:172 // if length > 3: dig 2 pushint 3 // 3 > bz test_bool_array_after_if_else@13 - // tests/artifacts/Arrays/immutable.py:172 + // tests/artifacts/Arrays/immutable.py:173 // assert not arr[length - 1], "expected last element to be False" dig 2 intc_1 // 1 @@ -1104,12 +1106,12 @@ test_bool_array_after_if_else@11: assert // expected last element to be False test_bool_array_after_if_else@13: - // tests/artifacts/Arrays/immutable.py:174 + // tests/artifacts/Arrays/immutable.py:175 // self.g = arr pushbytes "g" dig 2 app_global_put - // tests/artifacts/Arrays/immutable.py:175 + // tests/artifacts/Arrays/immutable.py:176 // if length: dig 2 bz test_bool_array_after_if_else@15 @@ -1137,10 +1139,10 @@ test_bool_array_after_if_else@13: intc_0 // 0 swap substring3 - // tests/artifacts/Arrays/immutable.py:177 + // tests/artifacts/Arrays/immutable.py:178 // assert arr.length == length - 1 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dig 3 intc_1 // 1 - @@ -1156,21 +1158,21 @@ test_bool_array_after_if_else@15: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_fixed_size_tuple_array[routing]() -> void: test_fixed_size_tuple_array: - // tests/artifacts/Arrays/immutable.py:181 + // tests/artifacts/Arrays/immutable.py:182 // arr = ImmutableArray[tuple[UInt64, UInt64]]() bytec_2 // 0x0000 - // tests/artifacts/Arrays/immutable.py:184 + // tests/artifacts/Arrays/immutable.py:185 // for i in urange(5): intc_0 // 0 test_fixed_size_tuple_array_for_header@2: - // tests/artifacts/Arrays/immutable.py:184 + // tests/artifacts/Arrays/immutable.py:185 // for i in urange(5): dup pushint 5 // 5 < bz test_fixed_size_tuple_array_after_for@5 - // tests/artifacts/Arrays/immutable.py:185 + // tests/artifacts/Arrays/immutable.py:186 // arr = arr.append((i + 1, i + 2)) dupn 2 intc_1 // 1 @@ -1200,17 +1202,17 @@ test_fixed_size_tuple_array_for_header@2: b test_fixed_size_tuple_array_for_header@2 test_fixed_size_tuple_array_after_for@5: - // tests/artifacts/Arrays/immutable.py:187 + // tests/artifacts/Arrays/immutable.py:188 // assert arr.length == 5 dig 1 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup pushint 5 // 5 == assert - // tests/artifacts/Arrays/immutable.py:188 + // tests/artifacts/Arrays/immutable.py:189 // assert arr[0] == (UInt64(1), UInt64(2)) dig 1 extract 2 0 @@ -1230,7 +1232,7 @@ test_fixed_size_tuple_array_after_for@5: == && assert - // tests/artifacts/Arrays/immutable.py:189 + // tests/artifacts/Arrays/immutable.py:190 // assert arr[-1] == (UInt64(5), UInt64(6)) swap intc_1 // 1 @@ -1253,21 +1255,21 @@ test_fixed_size_tuple_array_after_for@5: == && assert - // tests/artifacts/Arrays/immutable.py:191 + // tests/artifacts/Arrays/immutable.py:192 // arr = arr.pop() pushint 16 // 16 callsub dynamic_array_pop_fixed_size bury 1 - // tests/artifacts/Arrays/immutable.py:192 + // tests/artifacts/Arrays/immutable.py:193 // assert arr.length == 4 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup pushint 4 // 4 == assert - // tests/artifacts/Arrays/immutable.py:193 + // tests/artifacts/Arrays/immutable.py:194 // assert arr[0] == (UInt64(1), UInt64(2)) dig 1 extract 2 0 @@ -1287,7 +1289,7 @@ test_fixed_size_tuple_array_after_for@5: == && assert - // tests/artifacts/Arrays/immutable.py:194 + // tests/artifacts/Arrays/immutable.py:195 // assert arr[-1] == (UInt64(4), UInt64(5)) swap intc_1 // 1 @@ -1310,12 +1312,12 @@ test_fixed_size_tuple_array_after_for@5: == && assert - // tests/artifacts/Arrays/immutable.py:195 + // tests/artifacts/Arrays/immutable.py:196 // self.c = arr pushbytes "c" swap app_global_put - // tests/artifacts/Arrays/immutable.py:179 + // tests/artifacts/Arrays/immutable.py:180 // @arc4.abimethod() intc_1 // 1 return @@ -1323,21 +1325,21 @@ test_fixed_size_tuple_array_after_for@5: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_fixed_size_named_tuple_array[routing]() -> void: test_fixed_size_named_tuple_array: - // tests/artifacts/Arrays/immutable.py:199 + // tests/artifacts/Arrays/immutable.py:200 // arr = ImmutableArray[MyTuple]() bytec_2 // 0x0000 - // tests/artifacts/Arrays/immutable.py:202 + // tests/artifacts/Arrays/immutable.py:203 // for i in urange(5): intc_0 // 0 test_fixed_size_named_tuple_array_for_header@2: - // tests/artifacts/Arrays/immutable.py:202 + // tests/artifacts/Arrays/immutable.py:203 // for i in urange(5): dup pushint 5 // 5 < bz test_fixed_size_named_tuple_array_after_for@5 - // tests/artifacts/Arrays/immutable.py:203 + // tests/artifacts/Arrays/immutable.py:204 // arr = arr.append(MyTuple(foo=i, bar=i % 2 == 0, baz=i * 3 % 2 == 0)) dupn 2 intc_2 // 2 @@ -1372,7 +1374,7 @@ test_fixed_size_named_tuple_array_for_header@2: extract 6 2 replace2 0 bury 3 - // tests/artifacts/Arrays/immutable.py:202 + // tests/artifacts/Arrays/immutable.py:203 // for i in urange(5): intc_1 // 1 + @@ -1380,16 +1382,16 @@ test_fixed_size_named_tuple_array_for_header@2: b test_fixed_size_named_tuple_array_for_header@2 test_fixed_size_named_tuple_array_after_for@5: - // tests/artifacts/Arrays/immutable.py:205 + // tests/artifacts/Arrays/immutable.py:206 // assert arr.length == 5 dig 1 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header pushint 5 // 5 == assert - // tests/artifacts/Arrays/immutable.py:206 + // tests/artifacts/Arrays/immutable.py:207 // foo, bar, baz = arr[0] dup extract 2 9 @@ -1402,24 +1404,24 @@ test_fixed_size_named_tuple_array_after_for@5: uncover 2 pushint 65 // 65 getbit - // tests/artifacts/Arrays/immutable.py:207 + // tests/artifacts/Arrays/immutable.py:208 // assert foo == 0 uncover 2 ! assert - // tests/artifacts/Arrays/immutable.py:208 + // tests/artifacts/Arrays/immutable.py:209 // assert bar swap assert - // tests/artifacts/Arrays/immutable.py:209 + // tests/artifacts/Arrays/immutable.py:210 // assert baz assert - // tests/artifacts/Arrays/immutable.py:210 + // tests/artifacts/Arrays/immutable.py:211 // self.d = arr pushbytes "d" swap app_global_put - // tests/artifacts/Arrays/immutable.py:197 + // tests/artifacts/Arrays/immutable.py:198 // @arc4.abimethod() intc_1 // 1 return @@ -1428,21 +1430,21 @@ test_fixed_size_named_tuple_array_after_for@5: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_dynamic_sized_tuple_array[routing]() -> void: test_dynamic_sized_tuple_array: bytec_0 // "" - // tests/artifacts/Arrays/immutable.py:214 + // tests/artifacts/Arrays/immutable.py:215 // arr = ImmutableArray[tuple[UInt64, Bytes]]() bytec_2 // 0x0000 - // tests/artifacts/Arrays/immutable.py:217 + // tests/artifacts/Arrays/immutable.py:218 // for i in urange(5): intc_0 // 0 test_dynamic_sized_tuple_array_for_header@2: - // tests/artifacts/Arrays/immutable.py:217 + // tests/artifacts/Arrays/immutable.py:218 // for i in urange(5): dup pushint 5 // 5 < bz test_dynamic_sized_tuple_array_after_for@5 - // tests/artifacts/Arrays/immutable.py:218 + // tests/artifacts/Arrays/immutable.py:219 // arr = arr.append((i + 1, op.bzero(i))) dupn 2 intc_1 // 1 @@ -1480,29 +1482,29 @@ test_dynamic_sized_tuple_array_for_header@2: b test_dynamic_sized_tuple_array_for_header@2 test_dynamic_sized_tuple_array_after_for@5: - // tests/artifacts/Arrays/immutable.py:220 + // tests/artifacts/Arrays/immutable.py:221 // assert arr.length == 5 dig 1 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup bury 4 pushint 5 // 5 == assert - // tests/artifacts/Arrays/immutable.py:221 + // tests/artifacts/Arrays/immutable.py:222 // for i in urange(5): intc_0 // 0 bury 1 test_dynamic_sized_tuple_array_for_header@6: - // tests/artifacts/Arrays/immutable.py:221 + // tests/artifacts/Arrays/immutable.py:222 // for i in urange(5): dup pushint 5 // 5 < bz test_dynamic_sized_tuple_array_after_for@9 - // tests/artifacts/Arrays/immutable.py:222 + // tests/artifacts/Arrays/immutable.py:223 // assert arr[i][0] == i + 1, "expected 1st element to be correct" dig 1 extract 2 0 @@ -1550,7 +1552,7 @@ test_dynamic_sized_tuple_array_for_header@6: dig 2 == assert // expected 1st element to be correct - // tests/artifacts/Arrays/immutable.py:223 + // tests/artifacts/Arrays/immutable.py:224 // assert arr[i][1].length == i, "expected 2nd element to be correct" len uncover 2 @@ -1560,21 +1562,21 @@ test_dynamic_sized_tuple_array_for_header@6: b test_dynamic_sized_tuple_array_for_header@6 test_dynamic_sized_tuple_array_after_for@9: - // tests/artifacts/Arrays/immutable.py:225 + // tests/artifacts/Arrays/immutable.py:226 // arr = arr.pop() dig 1 callsub dynamic_array_pop_dynamic_element bury 1 - // tests/artifacts/Arrays/immutable.py:226 + // tests/artifacts/Arrays/immutable.py:227 // assert arr.length == 4 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup pushint 4 // 4 == assert - // tests/artifacts/Arrays/immutable.py:227 + // tests/artifacts/Arrays/immutable.py:228 // assert arr[0] == (UInt64(1), op.bzero(0)), "expected 1, 0" dig 1 extract 2 0 @@ -1618,7 +1620,7 @@ test_dynamic_sized_tuple_array_after_for@9: == && assert // expected 1, 0 - // tests/artifacts/Arrays/immutable.py:228 + // tests/artifacts/Arrays/immutable.py:229 // assert arr[-1] == (UInt64(4), op.bzero(3)), "expected 4, 3" dig 1 intc_2 // 2 @@ -1664,12 +1666,12 @@ test_dynamic_sized_tuple_array_after_for@9: == && assert // expected 4, 3 - // tests/artifacts/Arrays/immutable.py:229 + // tests/artifacts/Arrays/immutable.py:230 // self.e = arr pushbytes "e" swap app_global_put - // tests/artifacts/Arrays/immutable.py:212 + // tests/artifacts/Arrays/immutable.py:213 // @arc4.abimethod() intc_1 // 1 return @@ -1678,21 +1680,21 @@ test_dynamic_sized_tuple_array_after_for@9: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_dynamic_sized_named_tuple_array[routing]() -> void: test_dynamic_sized_named_tuple_array: bytec_0 // "" - // tests/artifacts/Arrays/immutable.py:233 + // tests/artifacts/Arrays/immutable.py:234 // arr = ImmutableArray[MyDynamicSizedTuple]() bytec_2 // 0x0000 - // tests/artifacts/Arrays/immutable.py:236 + // tests/artifacts/Arrays/immutable.py:237 // for i in urange(5): intc_0 // 0 test_dynamic_sized_named_tuple_array_for_header@2: - // tests/artifacts/Arrays/immutable.py:236 + // tests/artifacts/Arrays/immutable.py:237 // for i in urange(5): dup pushint 5 // 5 < bz test_dynamic_sized_named_tuple_array_after_for@5 - // tests/artifacts/Arrays/immutable.py:237 + // tests/artifacts/Arrays/immutable.py:238 // arr = arr.append(MyDynamicSizedTuple(foo=i + 1, bar=times(i))) dupn 2 intc_1 // 1 @@ -1730,29 +1732,29 @@ test_dynamic_sized_named_tuple_array_for_header@2: b test_dynamic_sized_named_tuple_array_for_header@2 test_dynamic_sized_named_tuple_array_after_for@5: - // tests/artifacts/Arrays/immutable.py:239 + // tests/artifacts/Arrays/immutable.py:240 // assert arr.length == 5 dig 1 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup bury 4 pushint 5 // 5 == assert - // tests/artifacts/Arrays/immutable.py:240 + // tests/artifacts/Arrays/immutable.py:241 // for i in urange(5): intc_0 // 0 bury 1 test_dynamic_sized_named_tuple_array_for_header@6: - // tests/artifacts/Arrays/immutable.py:240 + // tests/artifacts/Arrays/immutable.py:241 // for i in urange(5): dup pushint 5 // 5 < bz test_dynamic_sized_named_tuple_array_after_for@9 - // tests/artifacts/Arrays/immutable.py:241 + // tests/artifacts/Arrays/immutable.py:242 // assert arr[i][0] == i + 1, "expected 1st element to be correct" dig 1 extract 2 0 @@ -1800,7 +1802,7 @@ test_dynamic_sized_named_tuple_array_for_header@6: dig 2 == assert // expected 1st element to be correct - // tests/artifacts/Arrays/immutable.py:242 + // tests/artifacts/Arrays/immutable.py:243 // assert arr[i][1] == times(i), "expected 2nd element to be correct" uncover 2 callsub times @@ -1810,21 +1812,21 @@ test_dynamic_sized_named_tuple_array_for_header@6: b test_dynamic_sized_named_tuple_array_for_header@6 test_dynamic_sized_named_tuple_array_after_for@9: - // tests/artifacts/Arrays/immutable.py:244 + // tests/artifacts/Arrays/immutable.py:245 // arr = arr.pop() dig 1 callsub dynamic_array_pop_dynamic_element bury 1 - // tests/artifacts/Arrays/immutable.py:245 + // tests/artifacts/Arrays/immutable.py:246 // assert arr.length == 4 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup pushint 4 // 4 == assert - // tests/artifacts/Arrays/immutable.py:246 + // tests/artifacts/Arrays/immutable.py:247 // assert arr[0] == MyDynamicSizedTuple(UInt64(1), String()), "expected 1, 0" dig 1 extract 2 0 @@ -1867,7 +1869,7 @@ test_dynamic_sized_named_tuple_array_after_for@9: == && assert // expected 1, 0 - // tests/artifacts/Arrays/immutable.py:247 + // tests/artifacts/Arrays/immutable.py:248 // assert arr[-1] == MyDynamicSizedTuple(UInt64(4), String(" ")), "expected 4, 3" dig 1 intc_2 // 2 @@ -1912,12 +1914,12 @@ test_dynamic_sized_named_tuple_array_after_for@9: == && assert // expected 4, 3 - // tests/artifacts/Arrays/immutable.py:248 + // tests/artifacts/Arrays/immutable.py:249 // self.f = arr pushbytes "f" swap app_global_put - // tests/artifacts/Arrays/immutable.py:231 + // tests/artifacts/Arrays/immutable.py:232 // @arc4.abimethod() intc_1 // 1 return @@ -1925,13 +1927,13 @@ test_dynamic_sized_named_tuple_array_after_for@9: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_implicit_conversion_log[routing]() -> void: test_implicit_conversion_log: - // tests/artifacts/Arrays/immutable.py:250 + // tests/artifacts/Arrays/immutable.py:251 // @arc4.abimethod() txna ApplicationArgs 1 - // tests/artifacts/Arrays/immutable.py:252 + // tests/artifacts/Arrays/immutable.py:253 // log(arr) log - // tests/artifacts/Arrays/immutable.py:250 + // tests/artifacts/Arrays/immutable.py:251 // @arc4.abimethod() intc_1 // 1 return @@ -1939,17 +1941,17 @@ test_implicit_conversion_log: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_implicit_conversion_emit[routing]() -> void: test_implicit_conversion_emit: - // tests/artifacts/Arrays/immutable.py:256 + // tests/artifacts/Arrays/immutable.py:257 // arc4.emit("emit_test", arr) pushbytes 0xfa40c0530002 - // tests/artifacts/Arrays/immutable.py:254 + // tests/artifacts/Arrays/immutable.py:255 // @arc4.abimethod() txna ApplicationArgs 1 - // tests/artifacts/Arrays/immutable.py:256 + // tests/artifacts/Arrays/immutable.py:257 // arc4.emit("emit_test", arr) concat log - // tests/artifacts/Arrays/immutable.py:254 + // tests/artifacts/Arrays/immutable.py:255 // @arc4.abimethod() intc_1 // 1 return @@ -1961,41 +1963,41 @@ test_nested_array: dupn 2 bytec_0 // "" dupn 5 - // tests/artifacts/Arrays/immutable.py:258 + // tests/artifacts/Arrays/immutable.py:259 // @arc4.abimethod() txna ApplicationArgs 1 btoi txna ApplicationArgs 2 - // tests/artifacts/Arrays/immutable.py:262-263 + // tests/artifacts/Arrays/immutable.py:263-264 // # add n new arrays // for i in urange(arr_to_add): intc_0 // 0 test_nested_array_for_header@2: - // tests/artifacts/Arrays/immutable.py:262-263 + // tests/artifacts/Arrays/immutable.py:263-264 // # add n new arrays // for i in urange(arr_to_add): dup dig 3 < bz test_nested_array_after_for@9 - // tests/artifacts/Arrays/immutable.py:264 + // tests/artifacts/Arrays/immutable.py:265 // extra_arr = ImmutableArray[UInt64]() bytec_2 // 0x0000 bury 12 - // tests/artifacts/Arrays/immutable.py:265 + // tests/artifacts/Arrays/immutable.py:266 // for j in urange(i): intc_0 // 0 bury 5 test_nested_array_for_header@4: - // tests/artifacts/Arrays/immutable.py:265 + // tests/artifacts/Arrays/immutable.py:266 // for j in urange(i): dig 4 dig 1 < bz test_nested_array_after_for@7 - // tests/artifacts/Arrays/immutable.py:266 + // tests/artifacts/Arrays/immutable.py:267 // extra_arr = extra_arr.append(j) dig 4 dup @@ -2013,7 +2015,7 @@ test_nested_array_for_header@4: extract 6 2 replace2 0 bury 13 - // tests/artifacts/Arrays/immutable.py:265 + // tests/artifacts/Arrays/immutable.py:266 // for j in urange(i): intc_1 // 1 + @@ -2021,7 +2023,7 @@ test_nested_array_for_header@4: b test_nested_array_for_header@4 test_nested_array_after_for@7: - // tests/artifacts/Arrays/immutable.py:267 + // tests/artifacts/Arrays/immutable.py:268 // arr = arr.append(extra_arr) dig 1 dup @@ -2037,7 +2039,7 @@ test_nested_array_after_for@7: uncover 3 callsub dynamic_array_concat_dynamic_element bury 2 - // tests/artifacts/Arrays/immutable.py:262-263 + // tests/artifacts/Arrays/immutable.py:263-264 // # add n new arrays // for i in urange(arr_to_add): dup @@ -2047,22 +2049,22 @@ test_nested_array_after_for@7: b test_nested_array_for_header@2 test_nested_array_after_for@9: - // tests/artifacts/Arrays/immutable.py:269-270 + // tests/artifacts/Arrays/immutable.py:270-271 // # sum inner arrays and return an array containing sums // totals = ImmutableArray[UInt64]() bytec_2 // 0x0000 bury 10 - // tests/artifacts/Arrays/immutable.py:271 + // tests/artifacts/Arrays/immutable.py:272 // for inner_arr in arr: dig 1 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header bury 9 intc_0 // 0 bury 7 test_nested_array_for_header@10: - // tests/artifacts/Arrays/immutable.py:271 + // tests/artifacts/Arrays/immutable.py:272 // for inner_arr in arr: dig 6 dig 9 @@ -2085,20 +2087,20 @@ test_nested_array_for_header@10: extract3 dup bury 12 - // tests/artifacts/Arrays/immutable.py:609 + // tests/artifacts/Arrays/immutable.py:610 // total = UInt64() intc_0 // 0 bury 5 - // tests/artifacts/Arrays/immutable.py:610 + // tests/artifacts/Arrays/immutable.py:611 // for i in arr: intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header bury 8 intc_0 // 0 bury 6 test_nested_array_for_header@15: - // tests/artifacts/Arrays/immutable.py:610 + // tests/artifacts/Arrays/immutable.py:611 // for i in arr: dig 5 dig 8 @@ -2112,7 +2114,7 @@ test_nested_array_for_header@15: intc_3 // 8 * extract_uint64 - // tests/artifacts/Arrays/immutable.py:611 + // tests/artifacts/Arrays/immutable.py:612 // total += i dig 5 + @@ -2123,7 +2125,7 @@ test_nested_array_for_header@15: b test_nested_array_for_header@15 test_nested_array_after_for@17: - // tests/artifacts/Arrays/immutable.py:272 + // tests/artifacts/Arrays/immutable.py:273 // totals = totals.append(sum_arr(inner_arr)) dig 3 itob @@ -2147,7 +2149,7 @@ test_nested_array_after_for@17: b test_nested_array_for_header@10 test_nested_array_after_for@13: - // tests/artifacts/Arrays/immutable.py:258 + // tests/artifacts/Arrays/immutable.py:259 // @arc4.abimethod() bytec_1 // 0x151f7c75 dig 10 @@ -2159,26 +2161,26 @@ test_nested_array_after_for@13: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_bit_packed_tuples[routing]() -> void: test_bit_packed_tuples: - // tests/artifacts/Arrays/immutable.py:278 + // tests/artifacts/Arrays/immutable.py:279 // arr2 = ImmutableArray[TwoBoolTuple]() bytec_2 // 0x0000 - // tests/artifacts/Arrays/immutable.py:279-281 + // tests/artifacts/Arrays/immutable.py:280-282 // arr7 = ImmutableArray[SevenBoolTuple]() // arr8 = ImmutableArray[EightBoolTuple]() // arr9 = ImmutableArray[NineBoolTuple]() dupn 3 - // tests/artifacts/Arrays/immutable.py:287 + // tests/artifacts/Arrays/immutable.py:288 // for i in urange(5): intc_0 // 0 test_bit_packed_tuples_for_header@2: - // tests/artifacts/Arrays/immutable.py:287 + // tests/artifacts/Arrays/immutable.py:288 // for i in urange(5): dup pushint 5 // 5 < bz test_bit_packed_tuples_after_for@5 - // tests/artifacts/Arrays/immutable.py:288 + // tests/artifacts/Arrays/immutable.py:289 // arr2 = arr2.append(TwoBoolTuple(a=i == 0, b=i == 1)) dupn 2 ! @@ -2206,37 +2208,37 @@ test_bit_packed_tuples_for_header@2: extract 6 2 replace2 0 bury 7 - // tests/artifacts/Arrays/immutable.py:295 - // c=i == 2, + // tests/artifacts/Arrays/immutable.py:293 + // bar=i + 1, dig 1 + intc_1 // 1 + + + // tests/artifacts/Arrays/immutable.py:296 + // c=i == 2, + dig 2 intc_2 // 2 == - // tests/artifacts/Arrays/immutable.py:296 + // tests/artifacts/Arrays/immutable.py:297 // d=i == 3, - dig 2 + dig 3 pushint 3 // 3 == - // tests/artifacts/Arrays/immutable.py:297 + // tests/artifacts/Arrays/immutable.py:298 // e=i == 4, - dig 3 + dig 4 pushint 4 // 4 == - // tests/artifacts/Arrays/immutable.py:298 + // tests/artifacts/Arrays/immutable.py:299 // f=i == 5, - dig 4 + dig 5 pushint 5 // 5 == - // tests/artifacts/Arrays/immutable.py:299 + // tests/artifacts/Arrays/immutable.py:300 // g=i == 6, - dig 5 + dig 6 pushint 6 // 6 == - // tests/artifacts/Arrays/immutable.py:292 - // bar=i + 1, - dig 6 - intc_1 // 1 - + - // tests/artifacts/Arrays/immutable.py:289-301 + // tests/artifacts/Arrays/immutable.py:290-302 // arr7 = arr7.append( // SevenBoolTuple( // foo=i, @@ -2254,19 +2256,19 @@ test_bit_packed_tuples_for_header@2: itob uncover 7 intc_2 // 2 - uncover 8 + uncover 7 setbit pushint 3 // 3 - uncover 7 + uncover 6 setbit pushint 4 // 4 - uncover 6 + uncover 5 setbit pushint 5 // 5 - uncover 5 + uncover 4 setbit pushint 6 // 6 - uncover 4 + uncover 3 setbit dup2 concat @@ -2288,12 +2290,12 @@ test_bit_packed_tuples_for_header@2: extract 6 2 replace2 0 bury 9 - // tests/artifacts/Arrays/immutable.py:313 + // tests/artifacts/Arrays/immutable.py:314 // h=i == 7, dig 4 pushint 7 // 7 == - // tests/artifacts/Arrays/immutable.py:302-315 + // tests/artifacts/Arrays/immutable.py:303-316 // arr8 = arr8.append( // EightBoolTuple( // foo=i, @@ -2331,12 +2333,12 @@ test_bit_packed_tuples_for_header@2: extract 6 2 replace2 0 bury 7 - // tests/artifacts/Arrays/immutable.py:328 + // tests/artifacts/Arrays/immutable.py:329 // i=i == 8, uncover 3 intc_3 // 8 == - // tests/artifacts/Arrays/immutable.py:316-330 + // tests/artifacts/Arrays/immutable.py:317-331 // arr9 = arr9.append( // NineBoolTuple( // foo=i, @@ -2376,63 +2378,63 @@ test_bit_packed_tuples_for_header@2: b test_bit_packed_tuples_for_header@2 test_bit_packed_tuples_after_for@5: - // tests/artifacts/Arrays/immutable.py:332 + // tests/artifacts/Arrays/immutable.py:333 // assert arr2.length == 5 dig 4 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header pushint 5 // 5 == assert - // tests/artifacts/Arrays/immutable.py:333 + // tests/artifacts/Arrays/immutable.py:334 // assert arr7.length == 5 dig 4 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header pushint 5 // 5 == assert - // tests/artifacts/Arrays/immutable.py:334 + // tests/artifacts/Arrays/immutable.py:335 // assert arr8.length == 5 dig 4 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header pushint 5 // 5 == assert - // tests/artifacts/Arrays/immutable.py:335 + // tests/artifacts/Arrays/immutable.py:336 // assert arr9.length == 5 dig 4 dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header pushint 5 // 5 == assert - // tests/artifacts/Arrays/immutable.py:336 + // tests/artifacts/Arrays/immutable.py:337 // self.bool2 = arr2 pushbytes "bool2" uncover 4 app_global_put - // tests/artifacts/Arrays/immutable.py:337 + // tests/artifacts/Arrays/immutable.py:338 // self.bool7 = arr7 pushbytes "bool7" uncover 3 app_global_put - // tests/artifacts/Arrays/immutable.py:338 + // tests/artifacts/Arrays/immutable.py:339 // self.bool8 = arr8 pushbytes "bool8" uncover 2 app_global_put - // tests/artifacts/Arrays/immutable.py:339 + // tests/artifacts/Arrays/immutable.py:340 // self.bool9 = arr9 pushbytes "bool9" swap app_global_put - // tests/artifacts/Arrays/immutable.py:276 + // tests/artifacts/Arrays/immutable.py:277 // @arc4.abimethod() intc_1 // 1 return @@ -2442,27 +2444,27 @@ test_bit_packed_tuples_after_for@5: sum_uints_and_lengths_and_trues: bytec_0 // "" dupn 6 - // tests/artifacts/Arrays/immutable.py:341 + // tests/artifacts/Arrays/immutable.py:342 // @arc4.abimethod() txna ApplicationArgs 1 txna ApplicationArgs 2 txna ApplicationArgs 3 txna ApplicationArgs 4 - // tests/artifacts/Arrays/immutable.py:349 + // tests/artifacts/Arrays/immutable.py:350 // sum1 = sum2 = sum3 = sum4 = UInt64() intc_0 // 0 dupn 3 - // tests/artifacts/Arrays/immutable.py:341 + // tests/artifacts/Arrays/immutable.py:342 // @arc4.abimethod() txna ApplicationArgs 1 - // tests/artifacts/Arrays/immutable.py:350 + // tests/artifacts/Arrays/immutable.py:351 // for i in arr1: intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header intc_0 // 0 sum_uints_and_lengths_and_trues_for_header@2: - // tests/artifacts/Arrays/immutable.py:350 + // tests/artifacts/Arrays/immutable.py:351 // for i in arr1: dup dig 2 @@ -2476,7 +2478,7 @@ sum_uints_and_lengths_and_trues_for_header@2: intc_3 // 8 * extract_uint64 - // tests/artifacts/Arrays/immutable.py:351 + // tests/artifacts/Arrays/immutable.py:352 // sum1 += i dig 4 + @@ -2487,17 +2489,17 @@ sum_uints_and_lengths_and_trues_for_header@2: b sum_uints_and_lengths_and_trues_for_header@2 sum_uints_and_lengths_and_trues_after_for@5: - // tests/artifacts/Arrays/immutable.py:352 + // tests/artifacts/Arrays/immutable.py:353 // for b in arr2: dig 8 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header bury 17 intc_0 // 0 bury 13 sum_uints_and_lengths_and_trues_for_header@6: - // tests/artifacts/Arrays/immutable.py:352 + // tests/artifacts/Arrays/immutable.py:353 // for b in arr2: dig 12 dig 17 @@ -2509,10 +2511,10 @@ sum_uints_and_lengths_and_trues_for_header@6: dig 9 swap getbit - // tests/artifacts/Arrays/immutable.py:353 + // tests/artifacts/Arrays/immutable.py:354 // if b: bz sum_uints_and_lengths_and_trues_after_if_else@9 - // tests/artifacts/Arrays/immutable.py:354 + // tests/artifacts/Arrays/immutable.py:355 // sum2 += 1 dig 3 intc_1 // 1 @@ -2527,17 +2529,17 @@ sum_uints_and_lengths_and_trues_after_if_else@9: b sum_uints_and_lengths_and_trues_for_header@6 sum_uints_and_lengths_and_trues_after_for@11: - // tests/artifacts/Arrays/immutable.py:355 + // tests/artifacts/Arrays/immutable.py:356 // for tup in arr3: dig 7 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header bury 16 intc_0 // 0 bury 12 sum_uints_and_lengths_and_trues_for_header@12: - // tests/artifacts/Arrays/immutable.py:355 + // tests/artifacts/Arrays/immutable.py:356 // for tup in arr3: dig 11 dig 16 @@ -2560,16 +2562,16 @@ sum_uints_and_lengths_and_trues_for_header@12: pushint 65 // 65 getbit bury 13 - // tests/artifacts/Arrays/immutable.py:356 + // tests/artifacts/Arrays/immutable.py:357 // sum3 += tup.foo dig 6 uncover 2 + bury 6 - // tests/artifacts/Arrays/immutable.py:357 + // tests/artifacts/Arrays/immutable.py:358 // if tup.bar: bz sum_uints_and_lengths_and_trues_after_if_else@15 - // tests/artifacts/Arrays/immutable.py:358 + // tests/artifacts/Arrays/immutable.py:359 // sum3 += 1 dig 4 intc_1 // 1 @@ -2577,11 +2579,11 @@ sum_uints_and_lengths_and_trues_for_header@12: bury 5 sum_uints_and_lengths_and_trues_after_if_else@15: - // tests/artifacts/Arrays/immutable.py:359 + // tests/artifacts/Arrays/immutable.py:360 // if tup.baz: dig 10 bz sum_uints_and_lengths_and_trues_after_if_else@17 - // tests/artifacts/Arrays/immutable.py:360 + // tests/artifacts/Arrays/immutable.py:361 // sum3 += 1 dig 4 intc_1 // 1 @@ -2596,17 +2598,17 @@ sum_uints_and_lengths_and_trues_after_if_else@17: b sum_uints_and_lengths_and_trues_for_header@12 sum_uints_and_lengths_and_trues_after_for@19: - // tests/artifacts/Arrays/immutable.py:361 + // tests/artifacts/Arrays/immutable.py:362 // for idx, dyn_tup in uenumerate(arr4): dig 6 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header bury 15 intc_0 // 0 bury 14 sum_uints_and_lengths_and_trues_for_header@20: - // tests/artifacts/Arrays/immutable.py:361 + // tests/artifacts/Arrays/immutable.py:362 // for idx, dyn_tup in uenumerate(arr4): dig 13 dig 15 @@ -2654,12 +2656,12 @@ sum_uints_and_lengths_and_trues_for_header@20: cover 2 substring3 extract 2 0 - // tests/artifacts/Arrays/immutable.py:362 + // tests/artifacts/Arrays/immutable.py:363 // sum4 += dyn_tup.foo dig 9 uncover 2 + - // tests/artifacts/Arrays/immutable.py:363 + // tests/artifacts/Arrays/immutable.py:364 // sum4 += dyn_tup.bar.bytes.length swap len @@ -2667,7 +2669,7 @@ sum_uints_and_lengths_and_trues_for_header@20: dig 1 + bury 9 - // tests/artifacts/Arrays/immutable.py:364 + // tests/artifacts/Arrays/immutable.py:365 // assert dyn_tup.bar.bytes.length == idx, "expected string length to match index" uncover 2 == @@ -2676,7 +2678,7 @@ sum_uints_and_lengths_and_trues_for_header@20: b sum_uints_and_lengths_and_trues_for_header@20 sum_uints_and_lengths_and_trues_after_for@23: - // tests/artifacts/Arrays/immutable.py:341 + // tests/artifacts/Arrays/immutable.py:342 // @arc4.abimethod() dig 2 itob @@ -2699,25 +2701,25 @@ sum_uints_and_lengths_and_trues_after_for@23: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_uint64_return[routing]() -> void: test_uint64_return: - // tests/artifacts/Arrays/immutable.py:368 + // tests/artifacts/Arrays/immutable.py:369 // @arc4.abimethod() txna ApplicationArgs 1 btoi - // tests/artifacts/Arrays/immutable.py:370 + // tests/artifacts/Arrays/immutable.py:371 // arr = ImmutableArray((UInt64(1), UInt64(2), UInt64(3))) pushbytes 0x0003000000000000000100000000000000020000000000000003 - // tests/artifacts/Arrays/immutable.py:371 + // tests/artifacts/Arrays/immutable.py:372 // for i in urange(append): intc_0 // 0 test_uint64_return_for_header@2: - // tests/artifacts/Arrays/immutable.py:371 + // tests/artifacts/Arrays/immutable.py:372 // for i in urange(append): dup dig 3 < bz test_uint64_return_after_for@5 - // tests/artifacts/Arrays/immutable.py:372 + // tests/artifacts/Arrays/immutable.py:373 // arr = arr.append(i) dupn 2 itob @@ -2734,7 +2736,7 @@ test_uint64_return_for_header@2: extract 6 2 replace2 0 bury 3 - // tests/artifacts/Arrays/immutable.py:371 + // tests/artifacts/Arrays/immutable.py:372 // for i in urange(append): intc_1 // 1 + @@ -2742,7 +2744,7 @@ test_uint64_return_for_header@2: b test_uint64_return_for_header@2 test_uint64_return_after_for@5: - // tests/artifacts/Arrays/immutable.py:368 + // tests/artifacts/Arrays/immutable.py:369 // @arc4.abimethod() bytec_1 // 0x151f7c75 dig 2 @@ -2754,25 +2756,25 @@ test_uint64_return_after_for@5: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_bool_return[routing]() -> void: test_bool_return: - // tests/artifacts/Arrays/immutable.py:375 + // tests/artifacts/Arrays/immutable.py:376 // @arc4.abimethod() txna ApplicationArgs 1 btoi - // tests/artifacts/Arrays/immutable.py:377 + // tests/artifacts/Arrays/immutable.py:378 // arr = ImmutableArray((True, False, True, False, True)) pushbytes 0x0005a8 - // tests/artifacts/Arrays/immutable.py:378 + // tests/artifacts/Arrays/immutable.py:379 // for i in urange(append): intc_0 // 0 test_bool_return_for_header@2: - // tests/artifacts/Arrays/immutable.py:378 + // tests/artifacts/Arrays/immutable.py:379 // for i in urange(append): dup dig 3 < bz test_bool_return_after_for@5 - // tests/artifacts/Arrays/immutable.py:379 + // tests/artifacts/Arrays/immutable.py:380 // arr = arr.append(i % 2 == 0) dupn 2 intc_2 // 2 @@ -2788,7 +2790,7 @@ test_bool_return_for_header@2: intc_3 // 8 callsub dynamic_array_concat_bits bury 3 - // tests/artifacts/Arrays/immutable.py:378 + // tests/artifacts/Arrays/immutable.py:379 // for i in urange(append): intc_1 // 1 + @@ -2796,7 +2798,7 @@ test_bool_return_for_header@2: b test_bool_return_for_header@2 test_bool_return_after_for@5: - // tests/artifacts/Arrays/immutable.py:375 + // tests/artifacts/Arrays/immutable.py:376 // @arc4.abimethod() bytec_1 // 0x151f7c75 dig 2 @@ -2808,25 +2810,25 @@ test_bool_return_after_for@5: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_tuple_return[routing]() -> void: test_tuple_return: - // tests/artifacts/Arrays/immutable.py:382 + // tests/artifacts/Arrays/immutable.py:383 // @arc4.abimethod() txna ApplicationArgs 1 btoi - // tests/artifacts/Arrays/immutable.py:384 + // tests/artifacts/Arrays/immutable.py:385 // arr = ImmutableArray((MyTuple(UInt64(), True, False),)) pushbytes 0x0001000000000000000080 - // tests/artifacts/Arrays/immutable.py:385 + // tests/artifacts/Arrays/immutable.py:386 // for i in urange(append): intc_0 // 0 test_tuple_return_for_header@2: - // tests/artifacts/Arrays/immutable.py:385 + // tests/artifacts/Arrays/immutable.py:386 // for i in urange(append): dup dig 3 < bz test_tuple_return_after_for@5 - // tests/artifacts/Arrays/immutable.py:386 + // tests/artifacts/Arrays/immutable.py:387 // arr = arr.append(MyTuple(foo=i, bar=i % 2 == 0, baz=i % 3 == 0)) dupn 2 intc_2 // 2 @@ -2859,7 +2861,7 @@ test_tuple_return_for_header@2: extract 6 2 replace2 0 bury 3 - // tests/artifacts/Arrays/immutable.py:385 + // tests/artifacts/Arrays/immutable.py:386 // for i in urange(append): intc_1 // 1 + @@ -2867,7 +2869,7 @@ test_tuple_return_for_header@2: b test_tuple_return_for_header@2 test_tuple_return_after_for@5: - // tests/artifacts/Arrays/immutable.py:382 + // tests/artifacts/Arrays/immutable.py:383 // @arc4.abimethod() bytec_1 // 0x151f7c75 dig 2 @@ -2879,25 +2881,25 @@ test_tuple_return_after_for@5: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_dynamic_tuple_return[routing]() -> void: test_dynamic_tuple_return: - // tests/artifacts/Arrays/immutable.py:389 + // tests/artifacts/Arrays/immutable.py:390 // @arc4.abimethod() txna ApplicationArgs 1 btoi - // tests/artifacts/Arrays/immutable.py:391 + // tests/artifacts/Arrays/immutable.py:392 // arr = ImmutableArray((MyDynamicSizedTuple(UInt64(), String("Hello")),)) pushbytes 0x000100020000000000000000000a000548656c6c6f - // tests/artifacts/Arrays/immutable.py:392 + // tests/artifacts/Arrays/immutable.py:393 // for i in urange(append): intc_0 // 0 test_dynamic_tuple_return_for_header@2: - // tests/artifacts/Arrays/immutable.py:392 + // tests/artifacts/Arrays/immutable.py:393 // for i in urange(append): dup dig 3 < bz test_dynamic_tuple_return_after_for@5 - // tests/artifacts/Arrays/immutable.py:393 + // tests/artifacts/Arrays/immutable.py:394 // arr = arr.append(MyDynamicSizedTuple(i, times(i))) dupn 2 callsub times @@ -2928,7 +2930,7 @@ test_dynamic_tuple_return_for_header@2: uncover 3 callsub dynamic_array_concat_dynamic_element bury 3 - // tests/artifacts/Arrays/immutable.py:392 + // tests/artifacts/Arrays/immutable.py:393 // for i in urange(append): intc_1 // 1 + @@ -2936,7 +2938,7 @@ test_dynamic_tuple_return_for_header@2: b test_dynamic_tuple_return_for_header@2 test_dynamic_tuple_return_after_for@5: - // tests/artifacts/Arrays/immutable.py:389 + // tests/artifacts/Arrays/immutable.py:390 // @arc4.abimethod() bytec_1 // 0x151f7c75 dig 2 @@ -2948,27 +2950,27 @@ test_dynamic_tuple_return_after_for@5: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_convert_to_array_and_back[routing]() -> void: test_convert_to_array_and_back: - // tests/artifacts/Arrays/immutable.py:396 + // tests/artifacts/Arrays/immutable.py:397 // @arc4.abimethod() txna ApplicationArgs 1 txna ApplicationArgs 2 btoi swap - // tests/artifacts/Arrays/immutable.py:401 + // tests/artifacts/Arrays/immutable.py:402 // mutable.extend(arr) extract 2 0 - // tests/artifacts/Arrays/immutable.py:402 + // tests/artifacts/Arrays/immutable.py:403 // for i in urange(append): intc_0 // 0 test_convert_to_array_and_back_for_header@2: - // tests/artifacts/Arrays/immutable.py:402 + // tests/artifacts/Arrays/immutable.py:403 // for i in urange(append): dup dig 3 < bz test_convert_to_array_and_back_after_for@5 - // tests/artifacts/Arrays/immutable.py:403 + // tests/artifacts/Arrays/immutable.py:404 // mutable.append(MyTuple(foo=i, bar=i % 2 == 0, baz=i % 3 == 0)) dupn 2 intc_2 // 2 @@ -2994,7 +2996,7 @@ test_convert_to_array_and_back_for_header@2: swap concat // on error: max array length exceeded bury 3 - // tests/artifacts/Arrays/immutable.py:402 + // tests/artifacts/Arrays/immutable.py:403 // for i in urange(append): intc_1 // 1 + @@ -3003,7 +3005,7 @@ test_convert_to_array_and_back_for_header@2: test_convert_to_array_and_back_after_for@5: dig 1 - // tests/artifacts/Arrays/immutable.py:404 + // tests/artifacts/Arrays/immutable.py:405 // return mutable.freeze() dup len @@ -3013,7 +3015,7 @@ test_convert_to_array_and_back_after_for@5: extract 6 2 swap concat - // tests/artifacts/Arrays/immutable.py:396 + // tests/artifacts/Arrays/immutable.py:397 // @arc4.abimethod() bytec_1 // 0x151f7c75 swap @@ -3025,13 +3027,13 @@ test_convert_to_array_and_back_after_for@5: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_concat_with_arc4_tuple[routing]() -> void: test_concat_with_arc4_tuple: - // tests/artifacts/Arrays/immutable.py:410 + // tests/artifacts/Arrays/immutable.py:411 // prefix = ImmutableArray((arc4.UInt64(1), arc4.UInt64(2))) bytec 8 // 0x000200000000000000010000000000000002 - // tests/artifacts/Arrays/immutable.py:406 + // tests/artifacts/Arrays/immutable.py:407 // @arc4.abimethod() txna ApplicationArgs 1 - // tests/artifacts/Arrays/immutable.py:411 + // tests/artifacts/Arrays/immutable.py:412 // result = prefix + arg concat // on error: max array length exceeded dup @@ -3042,7 +3044,7 @@ test_concat_with_arc4_tuple: itob extract 6 2 replace2 0 - // tests/artifacts/Arrays/immutable.py:406 + // tests/artifacts/Arrays/immutable.py:407 // @arc4.abimethod() bytec_1 // 0x151f7c75 swap @@ -3054,26 +3056,26 @@ test_concat_with_arc4_tuple: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_concat_with_native_tuple[routing]() -> void: test_concat_with_native_tuple: - // tests/artifacts/Arrays/immutable.py:414 + // tests/artifacts/Arrays/immutable.py:415 // @arc4.abimethod() txna ApplicationArgs 1 dup extract 0 8 swap extract 8 8 - // tests/artifacts/Arrays/immutable.py:419 + // tests/artifacts/Arrays/immutable.py:420 // result = prefix + arg concat - // tests/artifacts/Arrays/immutable.py:418 + // tests/artifacts/Arrays/immutable.py:419 // prefix = ImmutableArray((arc4.UInt64(1), arc4.UInt64(2))) bytec 8 // 0x000200000000000000010000000000000002 - // tests/artifacts/Arrays/immutable.py:419 + // tests/artifacts/Arrays/immutable.py:420 // result = prefix + arg swap concat // on error: max array length exceeded pushbytes 0x0004 replace2 0 - // tests/artifacts/Arrays/immutable.py:414 + // tests/artifacts/Arrays/immutable.py:415 // @arc4.abimethod() bytec_1 // 0x151f7c75 swap @@ -3085,21 +3087,21 @@ test_concat_with_native_tuple: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_dynamic_concat_with_arc4_tuple[routing]() -> void: test_dynamic_concat_with_arc4_tuple: - // tests/artifacts/Arrays/immutable.py:422 + // tests/artifacts/Arrays/immutable.py:423 // @arc4.abimethod() txna ApplicationArgs 1 - // tests/artifacts/Arrays/immutable.py:427 + // tests/artifacts/Arrays/immutable.py:428 // result = prefix + arg extract 4 0 - // tests/artifacts/Arrays/immutable.py:426 + // tests/artifacts/Arrays/immutable.py:427 // prefix = ImmutableArray((arc4.String("a"), arc4.String("b"))) bytec 9 // 0x000200040007000161000162 - // tests/artifacts/Arrays/immutable.py:427 + // tests/artifacts/Arrays/immutable.py:428 // result = prefix + arg swap intc_2 // 2 callsub dynamic_array_concat_byte_length_head - // tests/artifacts/Arrays/immutable.py:422 + // tests/artifacts/Arrays/immutable.py:423 // @arc4.abimethod() bytec_1 // 0x151f7c75 swap @@ -3111,7 +3113,7 @@ test_dynamic_concat_with_arc4_tuple: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_dynamic_concat_with_native_tuple[routing]() -> void: test_dynamic_concat_with_native_tuple: - // tests/artifacts/Arrays/immutable.py:430 + // tests/artifacts/Arrays/immutable.py:431 // @arc4.abimethod() txna ApplicationArgs 1 dup @@ -3130,18 +3132,18 @@ test_dynamic_concat_with_native_tuple: uncover 3 uncover 2 substring3 - // tests/artifacts/Arrays/immutable.py:435 + // tests/artifacts/Arrays/immutable.py:436 // result = prefix + arg concat - // tests/artifacts/Arrays/immutable.py:434 + // tests/artifacts/Arrays/immutable.py:435 // prefix = ImmutableArray((arc4.String("a"), arc4.String("b"))) bytec 9 // 0x000200040007000161000162 - // tests/artifacts/Arrays/immutable.py:435 + // tests/artifacts/Arrays/immutable.py:436 // result = prefix + arg swap intc_2 // 2 callsub dynamic_array_concat_byte_length_head - // tests/artifacts/Arrays/immutable.py:430 + // tests/artifacts/Arrays/immutable.py:431 // @arc4.abimethod() bytec_1 // 0x151f7c75 swap @@ -3153,11 +3155,11 @@ test_dynamic_concat_with_native_tuple: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_concat_immutable_dynamic[routing]() -> void: test_concat_immutable_dynamic: - // tests/artifacts/Arrays/immutable.py:438 + // tests/artifacts/Arrays/immutable.py:439 // @arc4.abimethod() txna ApplicationArgs 1 txna ApplicationArgs 2 - // tests/artifacts/Arrays/immutable.py:442 + // tests/artifacts/Arrays/immutable.py:443 // return imm1 + imm2 dig 1 intc_0 // 0 @@ -3168,13 +3170,13 @@ test_concat_immutable_dynamic: extract 2 0 uncover 3 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header uncover 3 uncover 3 uncover 2 uncover 3 callsub dynamic_array_concat_dynamic_element - // tests/artifacts/Arrays/immutable.py:438 + // tests/artifacts/Arrays/immutable.py:439 // @arc4.abimethod() bytec_1 // 0x151f7c75 swap @@ -3186,17 +3188,17 @@ test_concat_immutable_dynamic: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_immutable_arc4[routing]() -> void: test_immutable_arc4: - // tests/artifacts/Arrays/immutable.py:444 + // tests/artifacts/Arrays/immutable.py:445 // @arc4.abimethod() txna ApplicationArgs 1 - // tests/artifacts/Arrays/immutable.py:446 + // tests/artifacts/Arrays/immutable.py:447 // assert imm, "expected non empty array" dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup assert // expected non empty array - // tests/artifacts/Arrays/immutable.py:447 + // tests/artifacts/Arrays/immutable.py:448 // imm = imm.replace(imm.length - 1, imm[0]) intc_1 // 1 - @@ -3209,7 +3211,7 @@ test_immutable_arc4: + swap replace3 // on error: index access is out of bounds - // tests/artifacts/Arrays/immutable.py:444 + // tests/artifacts/Arrays/immutable.py:445 // @arc4.abimethod() bytec_1 // 0x151f7c75 swap @@ -3222,12 +3224,12 @@ test_immutable_arc4: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_imm_fixed_arr[routing]() -> void: test_imm_fixed_arr: bytec_0 // "" - // tests/artifacts/Arrays/immutable.py:452 + // tests/artifacts/Arrays/immutable.py:453 // arr1 = zero_bytes(NativeStruct3) pushint 48 // 48 bzero dup - // tests/artifacts/Arrays/immutable.py:453 + // tests/artifacts/Arrays/immutable.py:454 // struct12 = NativeStruct(Txn.num_app_args + 1, Txn.num_app_args + 2) txn NumAppArgs intc_1 // 1 @@ -3242,7 +3244,7 @@ test_imm_fixed_arr: concat dup cover 2 - // tests/artifacts/Arrays/immutable.py:454 + // tests/artifacts/Arrays/immutable.py:455 // arr2 = NativeStruct3((struct12, struct12, struct12)) dup dig 1 @@ -3251,22 +3253,22 @@ test_imm_fixed_arr: concat dup cover 2 - // tests/artifacts/Arrays/immutable.py:456 + // tests/artifacts/Arrays/immutable.py:457 // assert arr1 != arr2, "expected arrays to be different" != assert // expected arrays to be different - // tests/artifacts/Arrays/immutable.py:459 + // tests/artifacts/Arrays/immutable.py:460 // for i in urange(3): intc_0 // 0 test_imm_fixed_arr_for_header@2: - // tests/artifacts/Arrays/immutable.py:459 + // tests/artifacts/Arrays/immutable.py:460 // for i in urange(3): dup pushint 3 // 3 < bz test_imm_fixed_arr_after_for@5 - // tests/artifacts/Arrays/immutable.py:460 + // tests/artifacts/Arrays/immutable.py:461 // arr1 = arr1.replace(i, struct12) dupn 2 pushint 16 // 16 @@ -3276,7 +3278,7 @@ test_imm_fixed_arr_for_header@2: dig 5 replace3 // on error: index access is out of bounds bury 5 - // tests/artifacts/Arrays/immutable.py:459 + // tests/artifacts/Arrays/immutable.py:460 // for i in urange(3): intc_1 // 1 + @@ -3284,7 +3286,7 @@ test_imm_fixed_arr_for_header@2: b test_imm_fixed_arr_for_header@2 test_imm_fixed_arr_after_for@5: - // tests/artifacts/Arrays/immutable.py:462 + // tests/artifacts/Arrays/immutable.py:463 // assert arr1 == arr2, "expected arrays to be the same" dig 3 dig 2 @@ -3294,7 +3296,7 @@ test_imm_fixed_arr_after_for@5: bury 5 test_imm_fixed_arr_for_header@6: - // tests/artifacts/Arrays/immutable.py:464 + // tests/artifacts/Arrays/immutable.py:465 // for struct_it in arr1: dig 4 pushint 3 // 3 @@ -3308,7 +3310,7 @@ test_imm_fixed_arr_for_header@6: swap pushint 16 // 16 extract3 // on error: index access is out of bounds - // tests/artifacts/Arrays/immutable.py:465 + // tests/artifacts/Arrays/immutable.py:466 // assert struct_it == struct12, "expected items on iteration to be the same" dig 4 == @@ -3319,37 +3321,37 @@ test_imm_fixed_arr_for_header@6: b test_imm_fixed_arr_for_header@6 test_imm_fixed_arr_after_for@9: - // tests/artifacts/Arrays/immutable.py:467 + // tests/artifacts/Arrays/immutable.py:468 // self.imm_fixed_arr = arr1 bytec 10 // "imm_fixed_arr" dig 4 dup cover 2 app_global_put - // tests/artifacts/Arrays/immutable.py:471 + // tests/artifacts/Arrays/immutable.py:472 // assert sum_imm_fixed(mut_arr.freeze()) == 15, "expected sum to be 15" dup callsub sum_imm_fixed pushint 15 // 15 == assert // expected sum to be 15 - // tests/artifacts/Arrays/immutable.py:473 + // tests/artifacts/Arrays/immutable.py:474 // mut_arr[0] = NativeStruct(UInt64(), UInt64()) pushbytes 0x00000000000000000000000000000000 replace2 0 // on error: index access is out of bounds - // tests/artifacts/Arrays/immutable.py:474 + // 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 == assert // expected sum to be 10 - // tests/artifacts/Arrays/immutable.py:476 + // tests/artifacts/Arrays/immutable.py:477 // return self.imm_fixed_arr intc_0 // 0 bytec 10 // "imm_fixed_arr" app_global_get_ex assert // check self.imm_fixed_arr exists - // tests/artifacts/Arrays/immutable.py:450 + // tests/artifacts/Arrays/immutable.py:451 // @arc4.abimethod() bytec_1 // 0x151f7c75 swap diff --git a/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json b/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json index 61709af..beb97c3 100644 --- a/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json +++ b/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json @@ -607,161 +607,197 @@ }, { "pc": [ - 4104 + 4106 ], "errorMessage": "check self.imm_fixed_arr exists" }, { "pc": [ - 2179, - 2487 + 2181, + 2489 ], "errorMessage": "expected 1, 0" }, { "pc": [ - 2094, - 2402 + 2096, + 2404 ], "errorMessage": "expected 1st element to be correct" }, { "pc": [ - 2099, - 2409 + 2101, + 2411 ], "errorMessage": "expected 2nd element to be correct" }, { "pc": [ - 2240, - 2549 + 2242, + 2551 ], "errorMessage": "expected 4, 3" }, { "pc": [ - 3988 + 3990 ], "errorMessage": "expected arrays to be different" }, { "pc": [ - 4022 + 4024 ], "errorMessage": "expected arrays to be the same" }, { "pc": [ - 1548 + 1550 ], "errorMessage": "expected element 0 to be False" }, { "pc": [ - 1567 + 1569 ], "errorMessage": "expected element 1 to be False" }, { "pc": [ - 1585 + 1587 ], "errorMessage": "expected element 2 to be True" }, { "pc": [ - 4049 + 4051 ], "errorMessage": "expected items on iteration to be the same" }, { "pc": [ - 1611 + 1613 ], "errorMessage": "expected last element to be False" }, { "pc": [ - 3935 + 3937 ], "errorMessage": "expected non empty array" }, { "pc": [ - 3363 + 3365 ], "errorMessage": "expected string length to match index" }, { "pc": [ - 4099 + 4101 ], "errorMessage": "expected sum to be 10" }, { "pc": [ - 4072 + 4074 ], "errorMessage": "expected sum to be 15" }, { "pc": [ - 852, - 1156, - 1221, - 1289, - 1346, - 1456, - 1541, - 1560, - 1579, - 1602, - 1753, - 1817, - 2050, - 2131, - 2196, - 2358, - 2441, - 2504, - 3214, - 3307, - 3950, - 4007, - 4045, - 4091 + 854, + 1158, + 1223, + 1291, + 1348, + 1458, + 1543, + 1562, + 1581, + 1604, + 1755, + 1819, + 2052, + 2133, + 2198, + 2360, + 2443, + 2506, + 3216, + 3309, + 3952, + 4009, + 4047, + 4093 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 923, - 996, - 1120, - 1194, - 1244, - 1314, - 1426, - 1692, - 1881, - 2622, - 2769, - 2833, - 2919, - 2958, - 2989, - 3438, - 3571, - 3745, - 3779, - 3814 + 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 + ], + "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 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 1307 + 1309 ], "errorMessage": "overflow" } @@ -774,19 +810,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrIDB4IDB4MTUxZjdjNzUgMHgwMDAwIDB4MDAgMHgwMDAyIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgMHgwMDBhIDB4NjI2OTY3NzU2OTZlNzQgMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIgMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIgImltbV9maXhlZF9hcnIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5MwogICAgLy8gY2xhc3MgSW1tdXRhYmxlQXJyYXlDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg0NGQ0MmY5OSAweGI3ZWFhNjBiIDB4NzQzZDcwZWQgMHgxYzdlMDQ5NCAweGEyZDU4NjBiIDB4ZTA1ZmM1NjQgMHgxZTA5MmI4MyAweDAxMzEwMjYyIDB4Yzg2NTRhOTggMHg4OWQxOTZmOCAweDZjYjdjOTkxIDB4OTg5OGJmMDIgMHhmNmI2MWVlOCAweDYwYjg2YTdiIDB4NzNhZDI4M2YgMHg1MjlkZmFlOSAweDIwNmQ1MTRmIDB4ZTA2NDY1ZTIgMHhlYzAzMDBhMiAweGVjZGYxNGFmIDB4NTExYWNhNjQgMHgyOTg1MmU0ZiAweDZkNGFhMzU4IDB4YjdjYjk2YmQgLy8gbWV0aG9kICJ0ZXN0X3VpbnQ2NF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9iaWd1aW50X2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfYXJyYXkodWludDY0KXZvaWQiLCBtZXRob2QgInRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF9hcnJheSh1aW50NjQsdWludDY0W11bXSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9iaXRfcGFja2VkX3R1cGxlcygpdm9pZCIsIG1ldGhvZCAic3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlcyh1aW50NjRbXSxib29sW10sKHVpbnQ2NCxib29sLGJvb2wpW10sKHVpbnQ2NCxzdHJpbmcpW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInRlc3RfdWludDY0X3JldHVybih1aW50NjQpdWludDY0W10iLCBtZXRob2QgInRlc3RfYm9vbF9yZXR1cm4odWludDY0KWJvb2xbXSIsIG1ldGhvZCAidGVzdF90dXBsZV9yZXR1cm4odWludDY0KSh1aW50NjQsYm9vbCxib29sKVtdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuKHVpbnQ2NCkodWludDY0LHN0cmluZylbXSIsIG1ldGhvZCAidGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrKCh1aW50NjQsYm9vbCxib29sKVtdLHVpbnQ2NCkodWludDY0LGJvb2wsYm9vbClbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlKCh1aW50NjQsdWludDY0KSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUoKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NFtdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZSgoc3RyaW5nLHN0cmluZykpc3RyaW5nW10iLCBtZXRob2QgInRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUoKHN0cmluZyxzdHJpbmcpKXN0cmluZ1tdIiwgbWV0aG9kICJ0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYygodWludDY0LHN0cmluZylbXSwodWludDY0LHN0cmluZylbXSkodWludDY0LHN0cmluZylbXSIsIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJjNCgodWludDY0LHVpbnQ2NClbXSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9pbW1fZml4ZWRfYXJyKCkodWludDY0LHVpbnQ2NClbM10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X3VpbnQ2NF9hcnJheSB0ZXN0X2JpZ3VpbnRfYXJyYXkgdGVzdF9ib29sX2FycmF5IHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheSB0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXkgdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5IHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheSB0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nIHRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0IHRlc3RfbmVzdGVkX2FycmF5IHRlc3RfYml0X3BhY2tlZF90dXBsZXMgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlcyB0ZXN0X3VpbnQ2NF9yZXR1cm4gdGVzdF9ib29sX3JldHVybiB0ZXN0X3R1cGxlX3JldHVybiB0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuIHRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjayB0ZXN0X2NvbmNhdF93aXRoX2FyYzRfdHVwbGUgdGVzdF9jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUgdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX2FyYzRfdHVwbGUgdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZSB0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYyB0ZXN0X2ltbXV0YWJsZV9hcmM0IHRlc3RfaW1tX2ZpeGVkX2FycgogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDMxOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgcmVhZF9zdGVwOiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzOgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgLQogICAgYnplcm8KICAgIGZyYW1lX2RpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMwogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZnJhbWVfYnVyeSAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDUKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZ2V0Yml0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYml0c193aGlsZV90b3BAMwoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl93aGlsZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLnN1bV9pbW1fZml4ZWQoYXJyOiBieXRlcykgLT4gdWludDY0OgpzdW1faW1tX2ZpeGVkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY5LTU3MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBzdW1faW1tX2ZpeGVkKGFycjogTmF0aXZlU3RydWN0MykgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzEKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCgpzdW1faW1tX2ZpeGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3MgogICAgLy8gZm9yIGl0ZW0gaW4gYXJyOgogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA8CiAgICBieiBzdW1faW1tX2ZpeGVkX2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzItNTczCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICAvLyAgICAgdG90YWwgKz0gaXRlbS5mb28KICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzMKICAgIC8vIHRvdGFsICs9IGl0ZW0uZm9vCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3Mi01NzMKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIC8vICAgICB0b3RhbCArPSBpdGVtLmZvbwogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3MwogICAgLy8gdG90YWwgKz0gaXRlbS5mb28KICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTc0CiAgICAvLyB0b3RhbCArPSBpdGVtLmJhcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgc3VtX2ltbV9maXhlZF9mb3JfaGVhZGVyQDEKCnN1bV9pbW1fZml4ZWRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzUKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUudGltZXMobjogdWludDY0KSAtPiBieXRlczoKdGltZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzgtNTc5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRpbWVzKG46IFVJbnQ2NCkgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODAKICAgIC8vIHJlc3VsdCA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODEKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2Uobik6CiAgICBpbnRjXzAgLy8gMAoKdGltZXNfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTgxCiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG4pOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogdGltZXNfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MgogICAgLy8gcmVzdWx0ICs9IFN0cmluZygiICIpCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MQogICAgLy8gZm9yIF9pIGluIHVyYW5nZShuKToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRpbWVzX2Zvcl9oZWFkZXJAMQoKdGltZXNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODMKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLmFkZF94KGFycjogYnl0ZXMsIHg6IHVpbnQ2NCkgLT4gYnl0ZXM6CmFkZF94OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg2LTU4NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZGRfeChhcnI6IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0sIHg6IFVJbnQ2NCkgLT4gSW1tdXRhYmxlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzAgLy8gMAoKYWRkX3hfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiBhZGRfeF9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGkpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIGFkZF94X2Zvcl9oZWFkZXJAMQoKYWRkX3hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTAKICAgIC8vIHJldHVybiBhcnIKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfdWludDY0X2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTkKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoVUludDY0KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDMKICAgIC8vIGFyciA9IGFkZF94KGFyciwgVUludDY0KDUpKQogICAgcHVzaGludCA1IC8vIDUKICAgIGNhbGxzdWIgYWRkX3gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwNAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwNQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDcKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoVUludDY0KDQzKSkKICAgIHB1c2hpbnQgNDMgLy8gNDMKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MyAvLyA0MwogICAgPT0KICAgIGFzc2VydAogICAgaW50Y18yIC8vIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExMAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSA0MgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NQogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTUKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UoeCk6CiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExMgogICAgLy8gYXJyID0gcG9wX3goYXJyLCBVSW50NjQoMykpCiAgICBwdXNoaW50IDMgLy8gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk1CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF91aW50NjRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NQogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfdWludDY0X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExNAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE2CiAgICAvLyBhcnIgPSBhZGRfeChhcnIsIFVJbnQ2NCgxMCkpCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBwdXNoaW50IDE0IC8vIDE0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTgKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDkKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDkgLy8gOQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTIwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKFVJbnQ2NCg0NCkpCiAgICBwdXNoaW50IDQ0IC8vIDQ0CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjEKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBwdXNoaW50IDE1IC8vIDE1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjIKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQ0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDQgLy8gNDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyNAogICAgLy8gYXJyID0gYXJyLnJlcGxhY2UoMiwgVUludDY0KDIzKSkKICAgIHB1c2hpbnQgMjMgLy8gMjMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDE4IC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI1CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMTUgLy8gMTUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyNgogICAgLy8gYXNzZXJ0IGFyclsyXSA9PSAyMwogICAgZHVwCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyMyAvLyAyMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI4CiAgICAvLyBzZWxmLmEgPSBhcnIKICAgIHB1c2hieXRlcyAiYSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYmlndWludF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYmlndWludF9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzNQogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KFR4bi5udW1fYXBwX2FyZ3MgLSAxKSkKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgcHVzaGludCA2NCAvLyA2NAogICAgYnplcm8KICAgIGR1cAogICAgY292ZXIgMgogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzMgogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbQmlnVUludF0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzNQogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KFR4bi5udW1fYXBwX2FyZ3MgLSAxKSkKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgcHVzaGJ5dGVzIDB4MDAwMQogICAgcmVwbGFjZTIgMAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzYKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM3CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgICoKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWNfMCAvLyAweAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDIKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM5CiAgICAvLyBhcnIgPSBhZGRfeGIoYXJyLCBVSW50NjQoNSkpCiAgICBwdXNoaW50IDUgLy8gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICA8CiAgICBieiB0ZXN0X2JpZ3VpbnRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KGkpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgYnwKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDIKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9iaWd1aW50X2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9iaWd1aW50X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQwCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA2CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAqCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDA0CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQzCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoMioqNTEyIC0gMSkgLSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgogICAgc3dhcAogICAgYi0KICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBkaWcgNQogICAgYnwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMioqNTEyIC0gMgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAqCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ2CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgNjQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludCgyKio1MTIgLSAxKSkKICAgIHN3YXAKICAgIGJ5dGVjIDUgLy8gMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0OQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1MAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMioqNTEyIC0gMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NCAvLyA2NAogICAgKgogICAgcHVzaGludCA2NCAvLyA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTEKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMAogICAgZHVwCiAgICBleHRyYWN0IDIgNjQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTMKICAgIC8vIEJveChJbW11dGFibGVBcnJheVtCaWdVSW50XSwga2V5PWIiYmlndWludCIpLnZhbHVlID0gYXJyCiAgICBieXRlYyA3IC8vIDB4NjI2OTY3NzU2OTZlNzQKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAweDYyNjk2Nzc1Njk2ZTc0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2Jvb2xfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTcKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W2Jvb2xdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjAKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjAKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSA9PSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGRpZyAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYnVyeSA1CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjUKICAgIC8vIGlmIGxlbmd0aCA+IDA6CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjYKICAgIC8vIGFzc2VydCBub3QgYXJyWzBdLCAiZXhwZWN0ZWQgZWxlbWVudCAwIHRvIGJlIEZhbHNlIgogICAgZGlnIDMKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGVsZW1lbnQgMCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NwogICAgLy8gaWYgbGVuZ3RoID4gMToKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY4CiAgICAvLyBhc3NlcnQgbm90IGFyclsxXSwgImV4cGVjdGVkIGVsZW1lbnQgMSB0byBiZSBGYWxzZSIKICAgIGludGNfMSAvLyAxCiAgICBkaWcgNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxNyAvLyAxNwogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAxIHRvIGJlIEZhbHNlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY5CiAgICAvLyBpZiBsZW5ndGggPiAyOgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICA+CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcwCiAgICAvLyBhc3NlcnQgYXJyWzJdLCAiZXhwZWN0ZWQgZWxlbWVudCAyIHRvIGJlIFRydWUiCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDQKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGdldGJpdAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGVsZW1lbnQgMiB0byBiZSBUcnVlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MQogICAgLy8gaWYgbGVuZ3RoID4gMzoKICAgIGRpZyAyCiAgICBwdXNoaW50IDMgLy8gMwogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MgogICAgLy8gYXNzZXJ0IG5vdCBhcnJbbGVuZ3RoIC0gMV0sICJleHBlY3RlZCBsYXN0IGVsZW1lbnQgdG8gYmUgRmFsc2UiCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxhc3QgZWxlbWVudCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzQKICAgIC8vIHNlbGYuZyA9IGFycgogICAgcHVzaGJ5dGVzICJnIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzUKICAgIC8vIGlmIGxlbmd0aDoKICAgIGRpZyAyCiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBkaWcgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIHB1c2hpbnQgNyAvLyA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IGxlbmd0aCAtIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4MQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbdHVwbGVbVUludDY0LCBVSW50NjRdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg0CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4NAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoKGkgKyAxLCBpICsgMikpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg4CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg1KSwgVUludDY0KDYpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBzd2FwCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5MQogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemUKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTkyCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTkzCiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgVUludDY0KDUpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBzd2FwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NQogICAgLy8gc2VsZi5jID0gYXJyCiAgICBwdXNoYnl0ZXMgImMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk5CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtNeVR1cGxlXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwMgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDMKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICogMyAlIDIgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzIC8vIDMKICAgICoKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjA2CiAgICAvLyBmb28sIGJhciwgYmF6ID0gYXJyWzBdCiAgICBkdXAKICAgIGV4dHJhY3QgMiA5CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGdldGJpdAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDY1IC8vIDY1CiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNwogICAgLy8gYXNzZXJ0IGZvbyA9PSAwCiAgICB1bmNvdmVyIDIKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjA4CiAgICAvLyBhc3NlcnQgYmFyCiAgICBzd2FwCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwOQogICAgLy8gYXNzZXJ0IGJhegogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTAKICAgIC8vIHNlbGYuZCA9IGFycgogICAgcHVzaGJ5dGVzICJkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxNAogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbdHVwbGVbVUludDY0LCBCeXRlc11dKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxOAogICAgLy8gYXJyID0gYXJyLmFwcGVuZCgoaSArIDEsIG9wLmJ6ZXJvKGkpKSkKICAgIGR1cG4gMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYnVyeSA0CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjIxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjIxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMgogICAgLy8gYXNzZXJ0IGFycltpXVswXSA9PSBpICsgMSwgImV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZGlnIDYKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjIzCiAgICAvLyBhc3NlcnQgYXJyW2ldWzFdLmxlbmd0aCA9PSBpLCAiZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjUKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgZGlnIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNgogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNwogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBvcC5iemVybygwKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDEsIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgb3AuYnplcm8oMykpLCAiZXhwZWN0ZWQgNCwgMyIKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDQKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgcHVzaGludCAzIC8vIDMKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDQsIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOQogICAgLy8gc2VsZi5lID0gYXJyCiAgICBwdXNoYnl0ZXMgImUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5OgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjMzCiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtNeUR5bmFtaWNTaXplZFR1cGxlXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzcKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShmb289aSArIDEsIGJhcj10aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzkKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYnVyeSA0CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0MQogICAgLy8gYXNzZXJ0IGFycltpXVswXSA9PSBpICsgMSwgImV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZGlnIDYKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQyCiAgICAvLyBhc3NlcnQgYXJyW2ldWzFdID09IHRpbWVzKGkpLCAiZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0aW1lcwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCAybmQgZWxlbWVudCB0byBiZSBjb3JyZWN0CiAgICBidXJ5IDEKICAgIGIgdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJANgoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ0CiAgICAvLyBhcnIgPSBhcnIucG9wKCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDYKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gTXlEeW5hbWljU2l6ZWRUdXBsZShVSW50NjQoMSksIFN0cmluZygpKSwgImV4cGVjdGVkIDEsIDAiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgc3dhcAogICAgZGlnIDMKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBieXRlY18wIC8vICIiCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCAxLCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDcKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KDQpLCBTdHJpbmcoIiAgICIpKSwgImV4cGVjdGVkIDQsIDMiCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciA0CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIHN3YXAKICAgIHB1c2hieXRlcyAiICAgIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNCwgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ4CiAgICAvLyBzZWxmLmYgPSBhcnIKICAgIHB1c2hieXRlcyAiZiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1MgogICAgLy8gbG9nKGFycikKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2VtaXRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1NgogICAgLy8gYXJjNC5lbWl0KCJlbWl0X3Rlc3QiLCBhcnIpCiAgICBwdXNoYnl0ZXMgMHhmYTQwYzA1MzAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1NgogICAgLy8gYXJjNC5lbWl0KCJlbWl0X3Rlc3QiLCBhcnIpCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9uZXN0ZWRfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X25lc3RlZF9hcnJheToKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjYyLTI2MwogICAgLy8gIyBhZGQgbiBuZXcgYXJyYXlzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXJyX3RvX2FkZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjYyLTI2MwogICAgLy8gIyBhZGQgbiBuZXcgYXJyYXlzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXJyX3RvX2FkZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY0CiAgICAvLyBleHRyYV9hcnIgPSBJbW11dGFibGVBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBidXJ5IDEyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjUKICAgIC8vIGZvciBqIGluIHVyYW5nZShpKToKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKCnRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NQogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JANwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBleHRyYV9hcnIgPSBleHRyYV9hcnIuYXBwZW5kKGopCiAgICBkaWcgNAogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMTMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjUKICAgIC8vIGZvciBqIGluIHVyYW5nZShpKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckA0Cgp0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChleHRyYV9hcnIpCiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyA0IC8vIDB4MDAwMgogICAgZGlnIDE0CiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2Mi0yNjMKICAgIC8vICMgYWRkIG4gbmV3IGFycmF5cwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFycl90b19hZGQpOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjktMjcwCiAgICAvLyAjIHN1bSBpbm5lciBhcnJheXMgYW5kIHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHN1bXMKICAgIC8vIHRvdGFscyA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGJ1cnkgMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MQogICAgLy8gZm9yIGlubmVyX2FyciBpbiBhcnI6CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBidXJ5IDkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKCnRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNzEKICAgIC8vIGZvciBpbm5lcl9hcnIgaW4gYXJyOgogICAgZGlnIDYKICAgIGRpZyA5CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTMKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDcKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwOQogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjEwCiAgICAvLyBmb3IgaSBpbiBhcnI6CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGJ1cnkgOAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMAogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgZGlnIDUKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTcKICAgIGRpZyAxMAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjExCiAgICAvLyB0b3RhbCArPSBpCiAgICBkaWcgNQogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTUKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MgogICAgLy8gdG90YWxzID0gdG90YWxzLmFwcGVuZChzdW1fYXJyKGlubmVyX2FycikpCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDEwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAxMAogICAgZGlnIDYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDcKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxMAoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpdF9wYWNrZWRfdHVwbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9iaXRfcGFja2VkX3R1cGxlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3OAogICAgLy8gYXJyMiA9IEltbXV0YWJsZUFycmF5W1R3b0Jvb2xUdXBsZV0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3OS0yODEKICAgIC8vIGFycjcgPSBJbW11dGFibGVBcnJheVtTZXZlbkJvb2xUdXBsZV0oKQogICAgLy8gYXJyOCA9IEltbXV0YWJsZUFycmF5W0VpZ2h0Qm9vbFR1cGxlXSgpCiAgICAvLyBhcnI5ID0gSW1tdXRhYmxlQXJyYXlbTmluZUJvb2xUdXBsZV0oKQogICAgZHVwbiAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyODcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4NwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9iaXRfcGFja2VkX3R1cGxlc19hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjg4CiAgICAvLyBhcnIyID0gYXJyMi5hcHBlbmQoVHdvQm9vbFR1cGxlKGE9aSA9PSAwLCBiPWkgPT0gMSkpCiAgICBkdXBuIDIKICAgICEKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk1CiAgICAvLyBjPWkgPT0gMiwKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5NgogICAgLy8gZD1pID09IDMsCiAgICBkaWcgMgogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTcKICAgIC8vIGU9aSA9PSA0LAogICAgZGlnIDMKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk4CiAgICAvLyBmPWkgPT0gNSwKICAgIGRpZyA0CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5OQogICAgLy8gZz1pID09IDYsCiAgICBkaWcgNQogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTIKICAgIC8vIGJhcj1pICsgMSwKICAgIGRpZyA2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjg5LTMwMQogICAgLy8gYXJyNyA9IGFycjcuYXBwZW5kKAogICAgLy8gICAgIFNldmVuQm9vbFR1cGxlKAogICAgLy8gICAgICAgICBmb289aSwKICAgIC8vICAgICAgICAgYmFyPWkgKyAxLAogICAgLy8gICAgICAgICBhPWkgPT0gMCwKICAgIC8vICAgICAgICAgYj1pID09IDEsCiAgICAvLyAgICAgICAgIGM9aSA9PSAyLAogICAgLy8gICAgICAgICBkPWkgPT0gMywKICAgIC8vICAgICAgICAgZT1pID09IDQsCiAgICAvLyAgICAgICAgIGY9aSA9PSA1LAogICAgLy8gICAgICAgICBnPWkgPT0gNiwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBkaWcgNwogICAgaXRvYgogICAgdW5jb3ZlciA3CiAgICBpbnRjXzIgLy8gMgogICAgdW5jb3ZlciA4CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICB1bmNvdmVyIDcKICAgIHNldGJpdAogICAgcHVzaGludCA0IC8vIDQKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBwdXNoaW50IDUgLy8gNQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNiAvLyA2CiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgZHVwMgogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMxMwogICAgLy8gaD1pID09IDcsCiAgICBkaWcgNAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMDItMzE1CiAgICAvLyBhcnI4ID0gYXJyOC5hcHBlbmQoCiAgICAvLyAgICAgRWlnaHRCb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICAgICBoPWkgPT0gNywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNyAvLyA3CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDcKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMyOAogICAgLy8gaT1pID09IDgsCiAgICB1bmNvdmVyIDMKICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzE2LTMzMAogICAgLy8gYXJyOSA9IGFycjkuYXBwZW5kKAogICAgLy8gICAgIE5pbmVCb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICAgICBoPWkgPT0gNywKICAgIC8vICAgICAgICAgaT1pID09IDgsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfYml0X3BhY2tlZF90dXBsZXNfZm9yX2hlYWRlckAyCgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzMyCiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzMzCiAgICAvLyBhc3NlcnQgYXJyNy5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM0CiAgICAvLyBhc3NlcnQgYXJyOC5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM1CiAgICAvLyBhc3NlcnQgYXJyOS5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM2CiAgICAvLyBzZWxmLmJvb2wyID0gYXJyMgogICAgcHVzaGJ5dGVzICJib29sMiIKICAgIHVuY292ZXIgNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzNwogICAgLy8gc2VsZi5ib29sNyA9IGFycjcKICAgIHB1c2hieXRlcyAiYm9vbDciCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzgKICAgIC8vIHNlbGYuYm9vbDggPSBhcnI4CiAgICBwdXNoYnl0ZXMgImJvb2w4IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM5CiAgICAvLyBzZWxmLmJvb2w5ID0gYXJyOQogICAgcHVzaGJ5dGVzICJib29sOSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC5zdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlczoKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzQ5CiAgICAvLyBzdW0xID0gc3VtMiA9IHN1bTMgPSBzdW00ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MAogICAgLy8gZm9yIGkgaW4gYXJyMToKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUwCiAgICAvLyBmb3IgaSBpbiBhcnIxOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JANQogICAgZGlnIDkKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MQogICAgLy8gc3VtMSArPSBpCiAgICBkaWcgNAogICAgKwogICAgYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAyCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUyCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDgKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgYnVyeSAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUyCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDEyCiAgICBkaWcgMTcKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDExCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICsKICAgIGRpZyA5CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MwogICAgLy8gaWYgYjoKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTQKICAgIC8vIHN1bTIgKz0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDEyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMwogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJANgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTUKICAgIC8vIGZvciB0dXAgaW4gYXJyMzoKICAgIGRpZyA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGJ1cnkgMTYKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEyCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMTI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTUKICAgIC8vIGZvciB0dXAgaW4gYXJyMzoKICAgIGRpZyAxMQogICAgZGlnIDE2CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAxOQogICAgZGlnIDcKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgOSAvLyA5CiAgICAqCiAgICBwdXNoaW50IDkgLy8gOQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGdldGJpdAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDY1IC8vIDY1CiAgICBnZXRiaXQKICAgIGJ1cnkgMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NgogICAgLy8gc3VtMyArPSB0dXAuZm9vCiAgICBkaWcgNgogICAgdW5jb3ZlciAyCiAgICArCiAgICBidXJ5IDYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NwogICAgLy8gaWYgdHVwLmJhcjoKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzU4CiAgICAvLyBzdW0zICs9IDEKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTkKICAgIC8vIGlmIHR1cC5iYXo6CiAgICBkaWcgMTAKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYwCiAgICAvLyBzdW0zICs9IDEKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICBkaWcgMTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEyCiAgICBiIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAxMgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjEKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyA2CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGJ1cnkgMTUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjEKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyAxMwogICAgZGlnIDE1CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMwogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgMTgKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYyCiAgICAvLyBzdW00ICs9IGR5bl90dXAuZm9vCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjMKICAgIC8vIHN1bTQgKz0gZHluX3R1cC5iYXIuYnl0ZXMubGVuZ3RoCiAgICBzd2FwCiAgICBsZW4KICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2NAogICAgLy8gYXNzZXJ0IGR5bl90dXAuYmFyLmJ5dGVzLmxlbmd0aCA9PSBpZHgsICJleHBlY3RlZCBzdHJpbmcgbGVuZ3RoIHRvIG1hdGNoIGluZGV4IgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN0cmluZyBsZW5ndGggdG8gbWF0Y2ggaW5kZXgKICAgIGJ1cnkgMTQKICAgIGIgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDIwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3VpbnQ2NF9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzAKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIHB1c2hieXRlcyAweDAwMDMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X3VpbnQ2NF9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gYXJyID0gYXJyLmFwcGVuZChpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzcxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF91aW50NjRfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYm9vbF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc3CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheSgoVHJ1ZSwgRmFsc2UsIFRydWUsIEZhbHNlLCBUcnVlKSkKICAgIHB1c2hieXRlcyAweDAwMDVhOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Jvb2xfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2Jvb2xfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzkKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSAlIDIgPT0gMCkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF90dXBsZV9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NAogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15VHVwbGUoVUludDY0KCksIFRydWUsIEZhbHNlKSwpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDA4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg1CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODUKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NgogICAgLy8gYXJyID0gYXJyLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAlCiAgICAhCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg1CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF90dXBsZV9yZXR1cm5fZm9yX2hlYWRlckAyCgp0ZXN0X3R1cGxlX3JldHVybl9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KCksIFN0cmluZygiSGVsbG8iKSksKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMGEwMDA1NDg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTMKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShpLCB0aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgdGltZXMKICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDYgLy8gMHgwMDBhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAxCiAgICAvLyBtdXRhYmxlLmV4dGVuZChhcnIpCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFja19hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAzCiAgICAvLyBtdXRhYmxlLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAlCiAgICAhCiAgICBkaWcgNAogICAgY292ZXIgMwogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2Zvcl9oZWFkZXJAMgoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNAogICAgLy8gcmV0dXJuIG11dGFibGUuZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDkgLy8gOQogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDEwCiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5VSW50NjQoMSksIGFyYzQuVUludDY0KDIpKSkKICAgIGJ5dGVjIDggLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxMQogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOQogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOAogICAgLy8gcHJlZml4ID0gSW1tdXRhYmxlQXJyYXkoKGFyYzQuVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSkpCiAgICBieXRlYyA4IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTkKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwdXNoYnl0ZXMgMHgwMDA0CiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDI3CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGV4dHJhY3QgNCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjYKICAgIC8vIHByZWZpeCA9IEltbXV0YWJsZUFycmF5KChhcmM0LlN0cmluZygiYSIpLCBhcmM0LlN0cmluZygiYiIpKSkKICAgIGJ5dGVjIDkgLy8gMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyNwogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM1CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM0CiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5TdHJpbmcoImEiKSwgYXJjNC5TdHJpbmcoImIiKSkpCiAgICBieXRlYyA5IC8vIDB4MDAwMjAwMDQwMDA3MDAwMTYxMDAwMTYyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzUKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0MgogICAgLy8gcmV0dXJuIGltbTEgKyBpbW0yCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltbXV0YWJsZV9hcmM0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW11dGFibGVfYXJjNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0NgogICAgLy8gYXNzZXJ0IGltbSwgImV4cGVjdGVkIG5vbiBlbXB0eSBhcnJheSIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBub24gZW1wdHkgYXJyYXkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0NwogICAgLy8gaW1tID0gaW1tLnJlcGxhY2UoaW1tLmxlbmd0aCAtIDEsIGltbVswXSkKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDE2CiAgICBzd2FwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltbV9maXhlZF9hcnJbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbV9maXhlZF9hcnI6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTIKICAgIC8vIGFycjEgPSB6ZXJvX2J5dGVzKE5hdGl2ZVN0cnVjdDMpCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBiemVybwogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTMKICAgIC8vIHN0cnVjdDEyID0gTmF0aXZlU3RydWN0KFR4bi5udW1fYXBwX2FyZ3MgKyAxLCBUeG4ubnVtX2FwcF9hcmdzICsgMikKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdHhuIE51bUFwcEFyZ3MKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU0CiAgICAvLyBhcnIyID0gTmF0aXZlU3RydWN0Mygoc3RydWN0MTIsIHN0cnVjdDEyLCBzdHJ1Y3QxMikpCiAgICBkdXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTYKICAgIC8vIGFzc2VydCBhcnIxICE9IGFycjIsICJleHBlY3RlZCBhcnJheXMgdG8gYmUgZGlmZmVyZW50IgogICAgIT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcnJheXMgdG8gYmUgZGlmZmVyZW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTkKICAgIC8vIGZvciBpIGluIHVyYW5nZSgzKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2ltbV9maXhlZF9hcnJfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA8CiAgICBieiB0ZXN0X2ltbV9maXhlZF9hcnJfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gYXJyMSA9IGFycjEucmVwbGFjZShpLCBzdHJ1Y3QxMikKICAgIGR1cG4gMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIGRpZyA1CiAgICByZXBsYWNlMyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfaW1tX2ZpeGVkX2Fycl9mb3JfaGVhZGVyQDIKCnRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MgogICAgLy8gYXNzZXJ0IGFycjEgPT0gYXJyMiwgImV4cGVjdGVkIGFycmF5cyB0byBiZSB0aGUgc2FtZSIKICAgIGRpZyAzCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcnJheXMgdG8gYmUgdGhlIHNhbWUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKCnRlc3RfaW1tX2ZpeGVkX2Fycl9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjQKICAgIC8vIGZvciBzdHJ1Y3RfaXQgaW4gYXJyMToKICAgIGRpZyA0CiAgICBwdXNoaW50IDMgLy8gMwogICAgPAogICAgYnogdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5CiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjUKICAgIC8vIGFzc2VydCBzdHJ1Y3RfaXQgPT0gc3RydWN0MTIsICJleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUiCiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY3CiAgICAvLyBzZWxmLmltbV9maXhlZF9hcnIgPSBhcnIxCiAgICBieXRlYyAxMCAvLyAiaW1tX2ZpeGVkX2FyciIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzEKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDE1LCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDE1IgogICAgZHVwCiAgICBjYWxsc3ViIHN1bV9pbW1fZml4ZWQKICAgIHB1c2hpbnQgMTUgLy8gMTUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgc3VtIHRvIGJlIDE1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzMKICAgIC8vIG11dF9hcnJbMF0gPSBOYXRpdmVTdHJ1Y3QoVUludDY0KCksIFVJbnQ2NCgpKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzQKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDEwLCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDEwIgogICAgY2FsbHN1YiBzdW1faW1tX2ZpeGVkCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN1bSB0byBiZSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc2CiAgICAvLyByZXR1cm4gc2VsZi5pbW1fZml4ZWRfYXJyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImltbV9maXhlZF9hcnIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1tX2ZpeGVkX2FyciBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrIDB4IDB4MTUxZjdjNzUgMHgwMDAwIDB4MDAgMHgwMDAyIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgMHgwMDBhIDB4NjI2OTY3NzU2OTZlNzQgMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIgMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIgImltbV9maXhlZF9hcnIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5MwogICAgLy8gY2xhc3MgSW1tdXRhYmxlQXJyYXlDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg0NGQ0MmY5OSAweGI3ZWFhNjBiIDB4NzQzZDcwZWQgMHgxYzdlMDQ5NCAweGEyZDU4NjBiIDB4ZTA1ZmM1NjQgMHgxZTA5MmI4MyAweDAxMzEwMjYyIDB4Yzg2NTRhOTggMHg4OWQxOTZmOCAweDZjYjdjOTkxIDB4OTg5OGJmMDIgMHhmNmI2MWVlOCAweDYwYjg2YTdiIDB4NzNhZDI4M2YgMHg1MjlkZmFlOSAweDIwNmQ1MTRmIDB4ZTA2NDY1ZTIgMHhlYzAzMDBhMiAweGVjZGYxNGFmIDB4NTExYWNhNjQgMHgyOTg1MmU0ZiAweDZkNGFhMzU4IDB4YjdjYjk2YmQgLy8gbWV0aG9kICJ0ZXN0X3VpbnQ2NF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9iaWd1aW50X2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfYXJyYXkodWludDY0KXZvaWQiLCBtZXRob2QgInRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF9hcnJheSh1aW50NjQsdWludDY0W11bXSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9iaXRfcGFja2VkX3R1cGxlcygpdm9pZCIsIG1ldGhvZCAic3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlcyh1aW50NjRbXSxib29sW10sKHVpbnQ2NCxib29sLGJvb2wpW10sKHVpbnQ2NCxzdHJpbmcpW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInRlc3RfdWludDY0X3JldHVybih1aW50NjQpdWludDY0W10iLCBtZXRob2QgInRlc3RfYm9vbF9yZXR1cm4odWludDY0KWJvb2xbXSIsIG1ldGhvZCAidGVzdF90dXBsZV9yZXR1cm4odWludDY0KSh1aW50NjQsYm9vbCxib29sKVtdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuKHVpbnQ2NCkodWludDY0LHN0cmluZylbXSIsIG1ldGhvZCAidGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrKCh1aW50NjQsYm9vbCxib29sKVtdLHVpbnQ2NCkodWludDY0LGJvb2wsYm9vbClbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlKCh1aW50NjQsdWludDY0KSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUoKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NFtdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZSgoc3RyaW5nLHN0cmluZykpc3RyaW5nW10iLCBtZXRob2QgInRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUoKHN0cmluZyxzdHJpbmcpKXN0cmluZ1tdIiwgbWV0aG9kICJ0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYygodWludDY0LHN0cmluZylbXSwodWludDY0LHN0cmluZylbXSkodWludDY0LHN0cmluZylbXSIsIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJjNCgodWludDY0LHVpbnQ2NClbXSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9pbW1fZml4ZWRfYXJyKCkodWludDY0LHVpbnQ2NClbM10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X3VpbnQ2NF9hcnJheSB0ZXN0X2JpZ3VpbnRfYXJyYXkgdGVzdF9ib29sX2FycmF5IHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheSB0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXkgdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5IHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheSB0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nIHRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0IHRlc3RfbmVzdGVkX2FycmF5IHRlc3RfYml0X3BhY2tlZF90dXBsZXMgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlcyB0ZXN0X3VpbnQ2NF9yZXR1cm4gdGVzdF9ib29sX3JldHVybiB0ZXN0X3R1cGxlX3JldHVybiB0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuIHRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjayB0ZXN0X2NvbmNhdF93aXRoX2FyYzRfdHVwbGUgdGVzdF9jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUgdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX2FyYzRfdHVwbGUgdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZSB0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYyB0ZXN0X2ltbXV0YWJsZV9hcmM0IHRlc3RfaW1tX2ZpeGVkX2FycgogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDMxOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplKGFycmF5OiBieXRlcywgZml4ZWRfYnl0ZV9zaXplOiB1aW50NjQpIC0+IGJ5dGVzLCBieXRlczoKZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZToKICAgIHByb3RvIDIgMgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBkdXAKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICBkdXAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QzCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudChhcnJheTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMSAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgYnl0ZWNfMCAvLyAweAogICAgaW50Y18wIC8vIDAKCmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyA1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2J1cnkgMQogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYml0cyhhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCByZWFkX3N0ZXA6IHVpbnQ2NCkgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHM6CiAgICBwcm90byA0IDEKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cG4gMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBmcmFtZV9kaWcgLTQKICAgIHN3YXAKICAgIHJlcGxhY2UyIDAKICAgIGNvdmVyIDIKICAgIHN3YXAKICAgIHB1c2hpbnQgNyAvLyA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNyAvLyA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICAtCiAgICBiemVybwogICAgZnJhbWVfZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuc3VtX2ltbV9maXhlZChhcnI6IGJ5dGVzKSAtPiB1aW50NjQ6CnN1bV9pbW1fZml4ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzAtNTcxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHN1bV9pbW1fZml4ZWQoYXJyOiBOYXRpdmVTdHJ1Y3QzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3MgogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnN1bV9pbW1fZml4ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTczCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCAzIC8vIDMKICAgIDwKICAgIGJ6IHN1bV9pbW1fZml4ZWRfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3My01NzQKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIC8vICAgICB0b3RhbCArPSBpdGVtLmZvbwogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgKgogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3NAogICAgLy8gdG90YWwgKz0gaXRlbS5mb28KICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTczLTU3NAogICAgLy8gZm9yIGl0ZW0gaW4gYXJyOgogICAgLy8gICAgIHRvdGFsICs9IGl0ZW0uZm9vCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTc0CiAgICAvLyB0b3RhbCArPSBpdGVtLmZvbwogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzUKICAgIC8vIHRvdGFsICs9IGl0ZW0uYmFyCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBzdW1faW1tX2ZpeGVkX2Zvcl9oZWFkZXJAMQoKc3VtX2ltbV9maXhlZF9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3NgogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS50aW1lcyhuOiB1aW50NjQpIC0+IGJ5dGVzOgp0aW1lczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3OS01ODAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdGltZXMobjogVUludDY0KSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MQogICAgLy8gcmVzdWx0ID0gU3RyaW5nKCkKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MgogICAgLy8gZm9yIF9pIGluIHVyYW5nZShuKToKICAgIGludGNfMCAvLyAwCgp0aW1lc19mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODIKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2Uobik6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiB0aW1lc19hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTgzCiAgICAvLyByZXN1bHQgKz0gU3RyaW5nKCIgIikKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoYnl0ZXMgIiAiCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTgyCiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG4pOgogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdGltZXNfZm9yX2hlYWRlckAxCgp0aW1lc19hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4NAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuYWRkX3goYXJyOiBieXRlcywgeDogdWludDY0KSAtPiBieXRlczoKYWRkX3g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODctNTg4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkZF94KGFycjogSW1tdXRhYmxlQXJyYXlbVUludDY0XSwgeDogVUludDY0KSAtPiBJbW11dGFibGVBcnJheVtVSW50NjRdOgogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODkKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGludGNfMCAvLyAwCgphZGRfeF9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODkKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIDwKICAgIGJ6IGFkZF94X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTAKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODkKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgYWRkX3hfZm9yX2hlYWRlckAxCgphZGRfeF9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5MQogICAgLy8gcmV0dXJuIGFycgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfdWludDY0X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF91aW50NjRfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5OQogICAgLy8gYXJyID0gYXJyLmFwcGVuZChVSW50NjQoNDIpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwMwogICAgLy8gYXJyID0gYWRkX3goYXJyLCBVSW50NjQoNSkpCiAgICBwdXNoaW50IDUgLy8gNQogICAgY2FsbHN1YiBhZGRfeAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA3CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKFVJbnQ2NCg0MykpCiAgICBwdXNoaW50IDQzIC8vIDQzCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwOAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MyAvLyA0MwogICAgPT0KICAgIGFzc2VydAogICAgaW50Y18yIC8vIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExMAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSA0MgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTYKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UoeCk6CiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExMgogICAgLy8gYXJyID0gcG9wX3goYXJyLCBVSW50NjQoMykpCiAgICBwdXNoaW50IDMgLy8gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF91aW50NjRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NwogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfdWludDY0X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE0CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTYKICAgIC8vIGFyciA9IGFkZF94KGFyciwgVUludDY0KDEwKSkKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGNhbGxzdWIgYWRkX3gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExNwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gMTQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNCAvLyAxNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE4CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA5CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA5IC8vIDkKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyMAogICAgLy8gYXJyID0gYXJyLmFwcGVuZChVSW50NjQoNDQpKQogICAgcHVzaGludCA0NCAvLyA0NAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTIxCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDE1IC8vIDE1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjIKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQ0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDQgLy8gNDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyNAogICAgLy8gYXJyID0gYXJyLnJlcGxhY2UoMiwgVUludDY0KDIzKSkKICAgIHB1c2hpbnQgMjMgLy8gMjMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDE4IC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI1CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxNSAvLyAxNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI2CiAgICAvLyBhc3NlcnQgYXJyWzJdID09IDIzCiAgICBkdXAKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIzIC8vIDIzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjgKICAgIC8vIHNlbGYuYSA9IGFycgogICAgcHVzaGJ5dGVzICJhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9iaWd1aW50X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9iaWd1aW50X2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM1CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoVHhuLm51bV9hcHBfYXJncyAtIDEpKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpdG9iCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBiemVybwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTMyCiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtCaWdVSW50XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM1CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoVHhuLm51bV9hcHBfYXJncyAtIDEpKQogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwdXNoYnl0ZXMgMHgwMDAxCiAgICByZXBsYWNlMiAwCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzNgogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzNwogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAqCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2JpZ3VpbnRfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzOQogICAgLy8gYXJyID0gYWRkX3hiKGFyciwgVUludDY0KDUpKQogICAgcHVzaGludCA1IC8vIDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF9iaWd1aW50X2FycmF5X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChpKSkKICAgIGR1cG4gMgogICAgaXRvYgogICAgZGlnIDQKICAgIGJ8CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYmlndWludF9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNgogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAqCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDA0CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQzCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoMioqNTEyIC0gMSkgLSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgogICAgc3dhcAogICAgYi0KICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBkaWcgNQogICAgYnwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDcgLy8gNwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ1CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAyKio1MTIgLSAyCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgICoKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmUKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDYKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMiA2NAogICAgYnl0ZWNfMCAvLyAweAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0OAogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KDIqKjUxMiAtIDEpKQogICAgc3dhcAogICAgYnl0ZWMgNSAvLyAweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ5CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTAKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDIqKjUxMiAtIDEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgICoKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgNSAvLyAweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTUxCiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDAKICAgIGR1cAogICAgZXh0cmFjdCAyIDY0CiAgICBieXRlY18wIC8vIDB4CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTUzCiAgICAvLyBCb3goSW1tdXRhYmxlQXJyYXlbQmlnVUludF0sIGtleT1iImJpZ3VpbnQiKS52YWx1ZSA9IGFycgogICAgYnl0ZWMgNyAvLyAweDYyNjk2Nzc1Njk2ZTc0CiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDcgLy8gMHg2MjY5Njc3NTY5NmU3NAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9ib29sX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9ib29sX2FycmF5OgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTU3CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtib29sXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYyCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGkgPT0gVHhuLm51bV9hcHBfYXJncykKICAgIHR4biBOdW1BcHBBcmdzCiAgICBkaWcgMQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZGlnIDMKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICBpbnRjXzMgLy8gOAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2MQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gbGVuZ3RoCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgYnVyeSA1CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjYKICAgIC8vIGlmIGxlbmd0aCA+IDA6CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjcKICAgIC8vIGFzc2VydCBub3QgYXJyWzBdLCAiZXhwZWN0ZWQgZWxlbWVudCAwIHRvIGJlIEZhbHNlIgogICAgZGlnIDMKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGVsZW1lbnQgMCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2OAogICAgLy8gaWYgbGVuZ3RoID4gMToKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY5CiAgICAvLyBhc3NlcnQgbm90IGFyclsxXSwgImV4cGVjdGVkIGVsZW1lbnQgMSB0byBiZSBGYWxzZSIKICAgIGludGNfMSAvLyAxCiAgICBkaWcgNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxNyAvLyAxNwogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAxIHRvIGJlIEZhbHNlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcwCiAgICAvLyBpZiBsZW5ndGggPiAyOgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICA+CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcxCiAgICAvLyBhc3NlcnQgYXJyWzJdLCAiZXhwZWN0ZWQgZWxlbWVudCAyIHRvIGJlIFRydWUiCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDQKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGdldGJpdAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGVsZW1lbnQgMiB0byBiZSBUcnVlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MgogICAgLy8gaWYgbGVuZ3RoID4gMzoKICAgIGRpZyAyCiAgICBwdXNoaW50IDMgLy8gMwogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbbGVuZ3RoIC0gMV0sICJleHBlY3RlZCBsYXN0IGVsZW1lbnQgdG8gYmUgRmFsc2UiCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxhc3QgZWxlbWVudCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzUKICAgIC8vIHNlbGYuZyA9IGFycgogICAgcHVzaGJ5dGVzICJnIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzYKICAgIC8vIGlmIGxlbmd0aDoKICAgIGRpZyAyCiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBkaWcgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIHB1c2hpbnQgNyAvLyA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzgKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IGxlbmd0aCAtIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgID09CiAgICBhc3NlcnQKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTgyCiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVt0dXBsZVtVSW50NjQsIFVJbnQ2NF1dKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODUKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg1CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4NgogICAgLy8gYXJyID0gYXJyLmFwcGVuZCgoaSArIDEsIGkgKyAyKSkKICAgIGR1cG4gMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OQogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBVSW50NjQoMikpCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTAKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IChVSW50NjQoNSksIFVJbnQ2NCg2KSkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgc3dhcAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTIKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgcHVzaGludCAxNiAvLyAxNgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5MwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk0CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgVUludDY0KDUpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBzd2FwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NgogICAgLy8gc2VsZi5jID0gYXJyCiAgICBwdXNoYnl0ZXMgImMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAwCiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtNeVR1cGxlXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICogMyAlIDIgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzIC8vIDMKICAgICoKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNgogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDcKICAgIC8vIGZvbywgYmFyLCBiYXogPSBhcnJbMF0KICAgIGR1cAogICAgZXh0cmFjdCAyIDkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgcHVzaGludCA2NCAvLyA2NAogICAgZ2V0Yml0CiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNjUgLy8gNjUKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjA4CiAgICAvLyBhc3NlcnQgZm9vID09IDAKICAgIHVuY292ZXIgMgogICAgIQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDkKICAgIC8vIGFzc2VydCBiYXIKICAgIHN3YXAKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjEwCiAgICAvLyBhc3NlcnQgYmF6CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxMQogICAgLy8gc2VsZi5kID0gYXJyCiAgICBwdXNoYnl0ZXMgImQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5OgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE1CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVt0dXBsZVtVSW50NjQsIEJ5dGVzXV0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxOAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgcHVzaGludCA1IC8vIDUKICAgIDwKICAgIGJ6IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE5CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgb3AuYnplcm8oaSkpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgYnplcm8KICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDYgLy8gMHgwMDBhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGJ1cnkgNAogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQoKdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjMKICAgIC8vIGFzc2VydCBhcnJbaV1bMF0gPT0gaSArIDEsICJleHBlY3RlZCAxc3QgZWxlbWVudCB0byBiZSBjb3JyZWN0IgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGRpZyA2CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNAogICAgLy8gYXNzZXJ0IGFycltpXVsxXS5sZW5ndGggPT0gaSwgImV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCAybmQgZWxlbWVudCB0byBiZSBjb3JyZWN0CiAgICBidXJ5IDEKICAgIGIgdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJANgoKdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjI2CiAgICAvLyBhcnIgPSBhcnIucG9wKCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBvcC5iemVybygwKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDEsIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgb3AuYnplcm8oMykpLCAiZXhwZWN0ZWQgNCwgMyIKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDQKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgcHVzaGludCAzIC8vIDMKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDQsIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzMAogICAgLy8gc2VsZi5lID0gYXJyCiAgICBwdXNoYnl0ZXMgImUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5OgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM0CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtNeUR5bmFtaWNTaXplZFR1cGxlXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzNwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShmb289aSArIDEsIGJhcj10aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDQKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKCnRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgcHVzaGludCA1IC8vIDUKICAgIDwKICAgIGJ6IHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQyCiAgICAvLyBhc3NlcnQgYXJyW2ldWzBdID09IGkgKyAxLCAiZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgNgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA1CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCAxc3QgZWxlbWVudCB0byBiZSBjb3JyZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDMKICAgIC8vIGFzc2VydCBhcnJbaV1bMV0gPT0gdGltZXMoaSksICJleHBlY3RlZCAybmQgZWxlbWVudCB0byBiZSBjb3JyZWN0IgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRpbWVzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDUKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgZGlnIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0NgogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ3CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KDEpLCBTdHJpbmcoKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAiIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMSwgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ4CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSBNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCg0KSwgU3RyaW5nKCIgICAiKSksICJleHBlY3RlZCA0LCAzIgogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgNAogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgIiAgICIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDQsIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0OQogICAgLy8gc2VsZi5mID0gYXJyCiAgICBwdXNoYnl0ZXMgImYiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTMKICAgIC8vIGxvZyhhcnIpCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2VtaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTcKICAgIC8vIGFyYzQuZW1pdCgiZW1pdF90ZXN0IiwgYXJyKQogICAgcHVzaGJ5dGVzIDB4ZmE0MGMwNTMwMDAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTcKICAgIC8vIGFyYzQuZW1pdCgiZW1pdF90ZXN0IiwgYXJyKQogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfbmVzdGVkX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfYXJyYXk6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2My0yNjQKICAgIC8vICMgYWRkIG4gbmV3IGFycmF5cwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFycl90b19hZGQpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2My0yNjQKICAgIC8vICMgYWRkIG4gbmV3IGFycmF5cwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFycl90b19hZGQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NQogICAgLy8gZXh0cmFfYXJyID0gSW1tdXRhYmxlQXJyYXlbVUludDY0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYnVyeSAxMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBmb3IgaiBpbiB1cmFuZ2UoaSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjYKICAgIC8vIGZvciBqIGluIHVyYW5nZShpKToKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgYnogdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NwogICAgLy8gZXh0cmFfYXJyID0gZXh0cmFfYXJyLmFwcGVuZChqKQogICAgZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDEzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAxMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBmb3IgaiBpbiB1cmFuZ2UoaSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJANAoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoZXh0cmFfYXJyKQogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIGRpZyAxNAogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcwLTI3MQogICAgLy8gIyBzdW0gaW5uZXIgYXJyYXlzIGFuZCByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBzdW1zCiAgICAvLyB0b3RhbHMgPSBJbW11dGFibGVBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBidXJ5IDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNzIKICAgIC8vIGZvciBpbm5lcl9hcnIgaW4gYXJyOgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBidXJ5IDkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKCnRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNzIKICAgIC8vIGZvciBpbm5lcl9hcnIgaW4gYXJyOgogICAgZGlnIDYKICAgIGRpZyA5CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTMKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDcKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMAogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjExCiAgICAvLyBmb3IgaSBpbiBhcnI6CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSA4CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2Cgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjExCiAgICAvLyBmb3IgaSBpbiBhcnI6CiAgICBkaWcgNQogICAgZGlnIDgKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckAxNwogICAgZGlnIDEwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MTIKICAgIC8vIHRvdGFsICs9IGkKICAgIGRpZyA1CiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxNQoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDE3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjczCiAgICAvLyB0b3RhbHMgPSB0b3RhbHMuYXBwZW5kKHN1bV9hcnIoaW5uZXJfYXJyKSkKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDEwCiAgICBkaWcgNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNwogICAgYiB0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDEwCgp0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYml0X3BhY2tlZF90dXBsZXNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjc5CiAgICAvLyBhcnIyID0gSW1tdXRhYmxlQXJyYXlbVHdvQm9vbFR1cGxlXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjgwLTI4MgogICAgLy8gYXJyNyA9IEltbXV0YWJsZUFycmF5W1NldmVuQm9vbFR1cGxlXSgpCiAgICAvLyBhcnI4ID0gSW1tdXRhYmxlQXJyYXlbRWlnaHRCb29sVHVwbGVdKCkKICAgIC8vIGFycjkgPSBJbW11dGFibGVBcnJheVtOaW5lQm9vbFR1cGxlXSgpCiAgICBkdXBuIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYml0X3BhY2tlZF90dXBsZXNfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjg4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyODkKICAgIC8vIGFycjIgPSBhcnIyLmFwcGVuZChUd29Cb29sVHVwbGUoYT1pID09IDAsIGI9aSA9PSAxKSkKICAgIGR1cG4gMgogICAgIQogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTMKICAgIC8vIGJhcj1pICsgMSwKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk2CiAgICAvLyBjPWkgPT0gMiwKICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5NwogICAgLy8gZD1pID09IDMsCiAgICBkaWcgMwogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTgKICAgIC8vIGU9aSA9PSA0LAogICAgZGlnIDQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk5CiAgICAvLyBmPWkgPT0gNSwKICAgIGRpZyA1CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMwMAogICAgLy8gZz1pID09IDYsCiAgICBkaWcgNgogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTAtMzAyCiAgICAvLyBhcnI3ID0gYXJyNy5hcHBlbmQoCiAgICAvLyAgICAgU2V2ZW5Cb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGRpZyA3CiAgICBpdG9iCiAgICB1bmNvdmVyIDcKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDcKICAgIHNldGJpdAogICAgcHVzaGludCAzIC8vIDMKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBwdXNoaW50IDQgLy8gNAogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNSAvLyA1CiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCA2IC8vIDYKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBkdXAyCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgOQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzE0CiAgICAvLyBoPWkgPT0gNywKICAgIGRpZyA0CiAgICBwdXNoaW50IDcgLy8gNwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMwMy0zMTYKICAgIC8vIGFycjggPSBhcnI4LmFwcGVuZCgKICAgIC8vICAgICBFaWdodEJvb2xUdXBsZSgKICAgIC8vICAgICAgICAgZm9vPWksCiAgICAvLyAgICAgICAgIGJhcj1pICsgMSwKICAgIC8vICAgICAgICAgYT1pID09IDAsCiAgICAvLyAgICAgICAgIGI9aSA9PSAxLAogICAgLy8gICAgICAgICBjPWkgPT0gMiwKICAgIC8vICAgICAgICAgZD1pID09IDMsCiAgICAvLyAgICAgICAgIGU9aSA9PSA0LAogICAgLy8gICAgICAgICBmPWkgPT0gNSwKICAgIC8vICAgICAgICAgZz1pID09IDYsCiAgICAvLyAgICAgICAgIGg9aSA9PSA3LAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzI5CiAgICAvLyBpPWkgPT0gOCwKICAgIHVuY292ZXIgMwogICAgaW50Y18zIC8vIDgKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMTctMzMxCiAgICAvLyBhcnI5ID0gYXJyOS5hcHBlbmQoCiAgICAvLyAgICAgTmluZUJvb2xUdXBsZSgKICAgIC8vICAgICAgICAgZm9vPWksCiAgICAvLyAgICAgICAgIGJhcj1pICsgMSwKICAgIC8vICAgICAgICAgYT1pID09IDAsCiAgICAvLyAgICAgICAgIGI9aSA9PSAxLAogICAgLy8gICAgICAgICBjPWkgPT0gMiwKICAgIC8vICAgICAgICAgZD1pID09IDMsCiAgICAvLyAgICAgICAgIGU9aSA9PSA0LAogICAgLy8gICAgICAgICBmPWkgPT0gNSwKICAgIC8vICAgICAgICAgZz1pID09IDYsCiAgICAvLyAgICAgICAgIGg9aSA9PSA3LAogICAgLy8gICAgICAgICBpPWkgPT0gOCwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9iaXRfcGFja2VkX3R1cGxlc19mb3JfaGVhZGVyQDIKCnRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzMKICAgIC8vIGFzc2VydCBhcnIyLmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzNAogICAgLy8gYXNzZXJ0IGFycjcubGVuZ3RoID09IDUKICAgIGRpZyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM1CiAgICAvLyBhc3NlcnQgYXJyOC5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzYKICAgIC8vIGFzc2VydCBhcnI5Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzNwogICAgLy8gc2VsZi5ib29sMiA9IGFycjIKICAgIHB1c2hieXRlcyAiYm9vbDIiCiAgICB1bmNvdmVyIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzgKICAgIC8vIHNlbGYuYm9vbDcgPSBhcnI3CiAgICBwdXNoYnl0ZXMgImJvb2w3IgogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM5CiAgICAvLyBzZWxmLmJvb2w4ID0gYXJyOAogICAgcHVzaGJ5dGVzICJib29sOCIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MAogICAgLy8gc2VsZi5ib29sOSA9IGFycjkKICAgIHB1c2hieXRlcyAiYm9vbDkiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3Quc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXM6CiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MAogICAgLy8gc3VtMSA9IHN1bTIgPSBzdW0zID0gc3VtNCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTEKICAgIC8vIGZvciBpIGluIGFycjE6CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18wIC8vIDAKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUxCiAgICAvLyBmb3IgaSBpbiBhcnIxOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JANQogICAgZGlnIDkKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MgogICAgLy8gc3VtMSArPSBpCiAgICBkaWcgNAogICAgKwogICAgYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAyCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUzCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDgKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBidXJ5IDE3CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMwoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTMKICAgIC8vIGZvciBiIGluIGFycjI6CiAgICBkaWcgMTIKICAgIGRpZyAxNwogICAgPAogICAgYnogc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTEKICAgIGRpZyAxMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZGlnIDkKICAgIHN3YXAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzU0CiAgICAvLyBpZiBiOgogICAgYnogc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NQogICAgLy8gc3VtMiArPSAxCiAgICBkaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNAoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgMTIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEzCiAgICBiIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckA2CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NgogICAgLy8gZm9yIHR1cCBpbiBhcnIzOgogICAgZGlnIDcKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBidXJ5IDE2CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzU2CiAgICAvLyBmb3IgdHVwIGluIGFycjM6CiAgICBkaWcgMTEKICAgIGRpZyAxNgogICAgPAogICAgYnogc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTkKICAgIGRpZyA3CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEyCiAgICBwdXNoaW50IDkgLy8gOQogICAgKgogICAgcHVzaGludCA5IC8vIDkKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NSAvLyA2NQogICAgZ2V0Yml0CiAgICBidXJ5IDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTcKICAgIC8vIHN1bTMgKz0gdHVwLmZvbwogICAgZGlnIDYKICAgIHVuY292ZXIgMgogICAgKwogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTgKICAgIC8vIGlmIHR1cC5iYXI6CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1OQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYwCiAgICAvLyBpZiB0dXAuYmF6OgogICAgZGlnIDEwCiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2MQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE3OgogICAgZGlnIDExCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMgogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYyCiAgICAvLyBmb3IgaWR4LCBkeW5fdHVwIGluIHVlbnVtZXJhdGUoYXJyNCk6CiAgICBkaWcgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgMTUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjIKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyAxMwogICAgZGlnIDE1CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMwogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgMTgKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYzCiAgICAvLyBzdW00ICs9IGR5bl90dXAuZm9vCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjQKICAgIC8vIHN1bTQgKz0gZHluX3R1cC5iYXIuYnl0ZXMubGVuZ3RoCiAgICBzd2FwCiAgICBsZW4KICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2NQogICAgLy8gYXNzZXJ0IGR5bl90dXAuYmFyLmJ5dGVzLmxlbmd0aCA9PSBpZHgsICJleHBlY3RlZCBzdHJpbmcgbGVuZ3RoIHRvIG1hdGNoIGluZGV4IgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN0cmluZyBsZW5ndGggdG8gbWF0Y2ggaW5kZXgKICAgIGJ1cnkgMTQKICAgIGIgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDIwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3VpbnQ2NF9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzEKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIHB1c2hieXRlcyAweDAwMDMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X3VpbnQ2NF9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzcyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF91aW50NjRfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYm9vbF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheSgoVHJ1ZSwgRmFsc2UsIFRydWUsIEZhbHNlLCBUcnVlKSkKICAgIHB1c2hieXRlcyAweDAwMDVhOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Jvb2xfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2Jvb2xfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODAKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSAlIDIgPT0gMCkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF90dXBsZV9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15VHVwbGUoVUludDY0KCksIFRydWUsIEZhbHNlKSwpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDA4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODYKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAlCiAgICAhCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF90dXBsZV9yZXR1cm5fZm9yX2hlYWRlckAyCgp0ZXN0X3R1cGxlX3JldHVybl9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MgogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KCksIFN0cmluZygiSGVsbG8iKSksKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMGEwMDA1NDg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShpLCB0aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgdGltZXMKICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDYgLy8gMHgwMDBhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAyCiAgICAvLyBtdXRhYmxlLmV4dGVuZChhcnIpCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFja19hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDA0CiAgICAvLyBtdXRhYmxlLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAlCiAgICAhCiAgICBkaWcgNAogICAgY292ZXIgMwogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2Zvcl9oZWFkZXJAMgoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNQogICAgLy8gcmV0dXJuIG11dGFibGUuZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDkgLy8gOQogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDExCiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5VSW50NjQoMSksIGFyYzQuVUludDY0KDIpKSkKICAgIGJ5dGVjIDggLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxMgogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyMAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOQogICAgLy8gcHJlZml4ID0gSW1tdXRhYmxlQXJyYXkoKGFyYzQuVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSkpCiAgICBieXRlYyA4IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjAKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwdXNoYnl0ZXMgMHgwMDA0CiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDI4CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGV4dHJhY3QgNCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjcKICAgIC8vIHByZWZpeCA9IEltbXV0YWJsZUFycmF5KChhcmM0LlN0cmluZygiYSIpLCBhcmM0LlN0cmluZygiYiIpKSkKICAgIGJ5dGVjIDkgLy8gMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyOAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM2CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM1CiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5TdHJpbmcoImEiKSwgYXJjNC5TdHJpbmcoImIiKSkpCiAgICBieXRlYyA5IC8vIDB4MDAwMjAwMDQwMDA3MDAwMTYxMDAwMTYyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzYKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0MwogICAgLy8gcmV0dXJuIGltbTEgKyBpbW0yCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FyYzRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcmM0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ3CiAgICAvLyBhc3NlcnQgaW1tLCAiZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5IgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NDgKICAgIC8vIGltbSA9IGltbS5yZXBsYWNlKGltbS5sZW5ndGggLSAxLCBpbW1bMF0pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAxNgogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbW1fZml4ZWRfYXJyW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW1fZml4ZWRfYXJyOgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDUzCiAgICAvLyBhcnIxID0gemVyb19ieXRlcyhOYXRpdmVTdHJ1Y3QzKQogICAgcHVzaGludCA0OCAvLyA0OAogICAgYnplcm8KICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU0CiAgICAvLyBzdHJ1Y3QxMiA9IE5hdGl2ZVN0cnVjdChUeG4ubnVtX2FwcF9hcmdzICsgMSwgVHhuLm51bV9hcHBfYXJncyArIDIpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1NQogICAgLy8gYXJyMiA9IE5hdGl2ZVN0cnVjdDMoKHN0cnVjdDEyLCBzdHJ1Y3QxMiwgc3RydWN0MTIpKQogICAgZHVwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU3CiAgICAvLyBhc3NlcnQgYXJyMSAhPSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudCIKICAgICE9CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgZHVwCiAgICBwdXNoaW50IDMgLy8gMwogICAgPAogICAgYnogdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjEKICAgIC8vIGFycjEgPSBhcnIxLnJlcGxhY2UoaSwgc3RydWN0MTIpCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIGRpZyA1CiAgICBzd2FwCiAgICBkaWcgNQogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ltbV9maXhlZF9hcnJfZm9yX2hlYWRlckAyCgp0ZXN0X2ltbV9maXhlZF9hcnJfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjMKICAgIC8vIGFzc2VydCBhcnIxID09IGFycjIsICJleHBlY3RlZCBhcnJheXMgdG8gYmUgdGhlIHNhbWUiCiAgICBkaWcgMwogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIHRoZSBzYW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X2ltbV9maXhlZF9hcnJfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY1CiAgICAvLyBmb3Igc3RydWN0X2l0IGluIGFycjE6CiAgICBkaWcgNAogICAgcHVzaGludCAzIC8vIDMKICAgIDwKICAgIGJ6IHRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JAOQogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY2CiAgICAvLyBhc3NlcnQgc3RydWN0X2l0ID09IHN0cnVjdDEyLCAiZXhwZWN0ZWQgaXRlbXMgb24gaXRlcmF0aW9uIHRvIGJlIHRoZSBzYW1lIgogICAgZGlnIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgaXRlbXMgb24gaXRlcmF0aW9uIHRvIGJlIHRoZSBzYW1lCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIHRlc3RfaW1tX2ZpeGVkX2Fycl9mb3JfaGVhZGVyQDYKCnRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2OAogICAgLy8gc2VsZi5pbW1fZml4ZWRfYXJyID0gYXJyMQogICAgYnl0ZWMgMTAgLy8gImltbV9maXhlZF9hcnIiCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDcyCiAgICAvLyBhc3NlcnQgc3VtX2ltbV9maXhlZChtdXRfYXJyLmZyZWV6ZSgpKSA9PSAxNSwgImV4cGVjdGVkIHN1bSB0byBiZSAxNSIKICAgIGR1cAogICAgY2FsbHN1YiBzdW1faW1tX2ZpeGVkCiAgICBwdXNoaW50IDE1IC8vIDE1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN1bSB0byBiZSAxNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc0CiAgICAvLyBtdXRfYXJyWzBdID0gTmF0aXZlU3RydWN0KFVJbnQ2NCgpLCBVSW50NjQoKSkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiAwIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc1CiAgICAvLyBhc3NlcnQgc3VtX2ltbV9maXhlZChtdXRfYXJyLmZyZWV6ZSgpKSA9PSAxMCwgImV4cGVjdGVkIHN1bSB0byBiZSAxMCIKICAgIGNhbGxzdWIgc3VtX2ltbV9maXhlZAogICAgcHVzaGludCAxMCAvLyAxMAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBzdW0gdG8gYmUgMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ3NwogICAgLy8gcmV0dXJuIHNlbGYuaW1tX2ZpeGVkX2FycgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJpbW1fZml4ZWRfYXJyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltbV9maXhlZF9hcnIgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "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/5cpSwpQsCNDKkcDIkmBBQxBAMZHAhRLASMSKyJPA1QjTwJUSwZJTgJLAVBPAiJZIwgWVwYCXABFB0sBJBJLAoEDEksDgQQSSwSBBRJLBYEGEksGIwhLBxZPByRPCFSBA08HVIEETwZUgQVPBVSBBk8EVEpQSwMWTEsBUEsJSU8CUEwiWSMIFlcGAlwARQlLBIEHEk8CgQdPAlRPAkxQSUsCUEsHSU8CUEwiWSMIFlcGAlwARQdPAyUSKyJPAlRQTFBLA0lPAlBMIlkjCBZXBgJcAEUDRQFC/zNLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkSABWJvb2wyTwRngAVib29sN08DZ4AFYm9vbDhPAmeABWJvb2w5TGcjQyhHBjYaATYaAjYaAzYaBCJHAzYaASJZIklLAgxBABlLCVcCAEsBSU4CJQtbSwQIRQQjCEUBQv/gSwgiWUURIkUNSwxLEQxBABtLDIEQCEsJTFNBAAZLAyMIRQRLDCMIRQ1C/91LByJZRRAiRQxLC0sQDEEAQEsHVwIASwyBCQuBCVhJIltLAYFAU08CgUFTRQ1LBk8CCEUGQQAGSwQjCEUFSwpBAAZLBCMIRQVLCyMIRQxC/7hLBiJZRQ8iRQ5LDUsPDEEAVksGVwIASw5JTgIkC0sBTFlLAiMISxJLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBLCU8CCEwVTEsBCEUJTwISREUOQv+iSwIWSwQWUEsFFlBLBhZQKUxQsCNDNhoBF4AaAAMAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAMiSUsDDEEAHUcCFksDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/cKUsCULAjQzYaAReAAwAFqCJJSwMMQQAbRwIkGBQrIk8CVEsDTCMliPQsRQMjCEUBQv/eKUsCULAjQzYaAReACwABAAAAAAAAAACAIklLAwxBADJHAiQYFEsBgQMYFEsCFisiTwRUI08DVFBLA0lPAlBMIlkjCBZXBgJcAEUDIwhFAUL/xylLAlCwI0M2GgEXgBUAAQACAAAAAAAAAAAACgAFSGVsbG8iSUsDDEEANkcCiPUySwNJIllMVwIASwMWSwMVFlcGAk8EUEwnBlBMUCcETFBOAiNPA4j0XUUDIwhFAUL/wylLAlCwI0M2GgE2GgIXTFcCACJJSwMMQQApRwIkGBRLAYEDGBRLBE4DSwIWKyJPBFQjTwNUUE8CTFBFAyMIRQFC/9BLAUkVgQkKFlcGAkxQKUxQsCNDJwg2GgFQSVcCABUlChZXBgJcAClMULAjQzYaAUlXAAhMVwgIUCcITFCAAgAEXAApTFCwI0M2GgFXBAAnCUwkiPNSKUxQsCNDNhoBSSJZSwEkWUsCTwJLAlJLAhVPA08DTwJSUCcJTCSI8ykpTFCwI0M2GgE2GgJLASJZTwJXAgBLAlcCAE8DIllPA08DTwJPA4jzailMULAjQzYaAUkiWUlEIwlLAVcCEEyBEAskCExdKUxQsCNDKIEwr0kxGyMIMRskCEwWTBZQSU4CSUsBUExQSU4CE0QiSYEDDEEAFEcCgRALSwVMSwVdRQUjCEUBQv/lSwNLAhJEIkUFSwSBAwxBABdLBEmBEAtLBUyBEFhLBBJEIwhFBUL/4ScKSwRJTgJnSYjzV4EPEkSAEAAAAAAAAAAAAAAAAAAAAABcAIjzPIEKEkQiJwplRClMULAjQw==", + "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", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [ diff --git a/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal b/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal index a47515e..9bc9213 100644 --- a/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal +++ b/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal @@ -34,7 +34,9 @@ main___algopy_default_create@16: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_1 // 1 + return // _puya_lib.arc4.dynamic_array_concat_bits(array: bytes, new_items_bytes: bytes, new_items_count: uint64, read_step: uint64) -> bytes: @@ -493,7 +495,7 @@ test_extend_from_tuple: // assert result[-1] == last dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header intc_1 // 1 - dig 1 @@ -884,7 +886,7 @@ test_arc4_bool: // assert dyn_arr.length == 2, "expected correct length" dup intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dup cover 3 dup diff --git a/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json b/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json index 94d1a26..3996cce 100644 --- a/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json +++ b/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json @@ -213,88 +213,95 @@ }, { "pc": [ - 1190, - 1207, - 1217 + 1192, + 1209, + 1219 ], "errorMessage": "check self.count exists" }, { "pc": [ - 1035 + 1037 ], "errorMessage": "expected 3 bytes" }, { "pc": [ - 752, - 763, - 863, - 1028, - 1117 + 754, + 765, + 865, + 1030, + 1119 ], "errorMessage": "expected correct length" }, { "pc": [ - 1055, - 1130 + 1057, + 1132 ], "errorMessage": "expected correct value at 0" }, { "pc": [ - 1075, - 1143 + 1077, + 1145 ], "errorMessage": "expected correct value at 1" }, { "pc": [ - 1156 + 1158 ], "errorMessage": "expected correct value at 2" }, { "pc": [ - 1168 + 1170 ], "errorMessage": "expected correct value at 3" }, { "pc": [ - 403, - 478, - 517, - 637, - 665, - 786, - 885, - 1037, - 1058, - 1119, - 1132, - 1145, - 1157 + 405, + 480, + 519, + 639, + 667, + 788, + 887, + 1039, + 1060, + 1121, + 1134, + 1147, + 1159 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 731, - 755, - 842, - 910, - 1001, - 1100 + 655, + 1022 + ], + "errorMessage": "invalid array length header" + }, + { + "pc": [ + 733, + 757, + 844, + 912, + 1003, + 1102 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 283, - 342, - 377 + 285, + 344, + 379 ], "errorMessage": "overflow" } @@ -307,19 +314,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxNiAxNDQKICAgIGJ5dGVjYmxvY2sgMHggMHgxNTFmN2M3NSAiY291bnQiIDB4MDAgMHgwMDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM5CiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM3CiAgICAvLyBjbGFzcyBTdGF0aWNTaXplQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MjhkN2MxYjggMHhmYTljYjk3MyAweDYwMzlhMjQwIDB4ZjhmZDY4YTcgMHgxZjAyOGRiMSAweDA5NmIzYTU5IDB4OGQ2ZTNhMjUgLy8gbWV0aG9kICJ0ZXN0X2FycmF5KHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZXh0ZW5kX2Zyb21fdHVwbGUoKCh1aW50NjQsdWludDY0KSwodWludDY0LHVpbnQ2NCkpKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJ0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGUoKCh1aW50NjQsdWludDY0KSwodWludDY0LHVpbnQ2NCkpKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfYXJyYXkodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9hcmM0X2NvbnZlcnNpb24odWludDY0KXVpbnQ2NFtdIiwgbWV0aG9kICJzdW1fYXJyYXkodWludDY0W10pdWludDY0IiwgbWV0aG9kICJ0ZXN0X2FyYzRfYm9vbCgpYm9vbFtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9hcnJheSB0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlIHRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZSB0ZXN0X2Jvb2xfYXJyYXkgdGVzdF9hcmM0X2NvbnZlcnNpb24gc3VtX2FycmF5IHRlc3RfYXJjNF9ib29sCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9iaXRzKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIHJlYWRfc3RlcDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYml0czoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtNAogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgY292ZXIgMgogICAgc3dhcAogICAgcHVzaGludCA3IC8vIDcKICAgICsKICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgICsKICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIC0KICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgNAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMAogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMyAvLyAxNgogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZnJhbWVfYnVyeSAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDUKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZ2V0Yml0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYml0c193aGlsZV90b3BAMwoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl93aGlsZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJyYXk6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQzCiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0NgogICAgLy8gUG9pbnQoeD1hcmM0LlVJbnQ2NCgpLCB5PVVJbnQ2NCgpLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICBjYWxsc3ViIHh0cmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDcKICAgIC8vIFBvaW50KHg9eDEsIHk9eTEsIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIGNhbGxzdWIgeHRyYQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0OAogICAgLy8gUG9pbnQoeD14MiwgeT15Miwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgY2FsbHN1YiB4dHJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ0LTUwCiAgICAvLyBwYXRoID0gUmVmZXJlbmNlQXJyYXkoCiAgICAvLyAgICAgKAogICAgLy8gICAgICAgICBQb2ludCh4PWFyYzQuVUludDY0KCksIHk9VUludDY0KCksIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIC8vICAgICAgICAgUG9pbnQoeD14MSwgeT15MSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgLy8gICAgICAgICBQb2ludCh4PXgyLCB5PXkyLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgZGlnIDExCiAgICBsZW4KICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDEyCiAgICBkaWcgMQogICAgYnwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBsZW4KICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgOQogICAgZGlnIDQKICAgIGJ8CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIHVuY292ZXIgOAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBifAogICAgY29uY2F0CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgZHVwCiAgICBwdXNoaW50IDMgLy8gMwogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MgogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuYiA9PSBpICsgMQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjIDQgLy8gMTQ0CiAgICAqCiAgICBpbnRjIDQgLy8gMTQ0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMTYgMTI4CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MwogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5mb28gPT0gaSArIDIKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggMTYKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHVuY292ZXIgMwogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU0CiAgICAvLyBhc3NlcnQgcGF0aFtpXS5vdGhlci5kLmJhciA9PSAoaSArIDEpICogKGkgKyAxKQogICAgZXh0cmFjdCA4IDgKICAgIGRpZyAxCiAgICBkaWcgMgogICAgKgogICAgaXRvYgogICAgYj09CiAgICBhc3NlcnQKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9hcnJheV9hZnRlcl9mb3JANToKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU2CiAgICAvLyBCb3goSW1tdXRhYmxlQXJyYXlbUG9pbnRdLCBrZXk9ImEiKS52YWx1ZSA9IHBhdGguZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjIDQgLy8gMTQ0CiAgICAvCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgImEiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHB1c2hieXRlcyAiYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTY5CiAgICAvLyBsYXN0X3BvaW50ID0gcGF0aFswXQogICAgZXh0cmFjdCAwIDE0NCAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSAxMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcwCiAgICAvLyBsZW5ndGggPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIGZvciBwb2ludF9pZHggaW4gdXJhbmdlKDEsIHBhdGgubGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICBidXJ5IDMKCnRlc3RfYXJyYXlfZm9yX2hlYWRlckA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIGZvciBwb2ludF9pZHggaW4gdXJhbmdlKDEsIHBhdGgubGVuZ3RoKToKICAgIGRpZyAyCiAgICBkaWcgOAogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JAMTUKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MgogICAgLy8gcG9pbnQgPSBwYXRoW3BvaW50X2lkeF0KICAgIGRpZyAzCiAgICBpbnRjIDQgLy8gMTQ0CiAgICAqCiAgICBpbnRjIDQgLy8gMTQ0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cG4gMgogICAgZXh0cmFjdCAwIDgKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MwogICAgLy8gaWYgcG9pbnQueCA8IGxhc3RfcG9pbnQueDoKICAgIGRpZyAxMAogICAgYjwKICAgIGJ6IHRlc3RfYXJyYXlfZWxzZV9ib2R5QDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NAogICAgLy8gZHggPSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkgLSBwb2ludC54LmFzX3VpbnQ2NCgpCiAgICBkaWcgMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTY5CiAgICAvLyBsYXN0X3BvaW50ID0gcGF0aFswXQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc0CiAgICAvLyBkeCA9IGxhc3RfcG9pbnQueC5hc191aW50NjQoKSAtIHBvaW50LnguYXNfdWludDY0KCkKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MgogICAgLy8gcG9pbnQgPSBwYXRoW3BvaW50X2lkeF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NAogICAgLy8gZHggPSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkgLSBwb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgYnVyeSA3Cgp0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NwogICAgLy8gaWYgcG9pbnQueSA8IGxhc3RfcG9pbnQueToKICAgIGRpZyAzCiAgICBkaWcgNgogICAgPAogICAgYnogdGVzdF9hcnJheV9lbHNlX2JvZHlAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc4CiAgICAvLyBkeSA9IGxhc3RfcG9pbnQueSAtIHBvaW50LnkKICAgIGRpZyA1CiAgICBkaWcgNAogICAgLQoKdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDE0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxODEKICAgIC8vIGxlbmd0aCArPSBvcC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KQogICAgZGlnIDcKICAgIGR1cAogICAgKgogICAgc3dhcAogICAgZHVwCiAgICAqCiAgICArCiAgICBzcXJ0CiAgICBkaWcgNQogICAgKwogICAgYnVyeSA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MQogICAgLy8gZm9yIHBvaW50X2lkeCBpbiB1cmFuZ2UoMSwgcGF0aC5sZW5ndGgpOgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgdGVzdF9hcnJheV9mb3JfaGVhZGVyQDcKCnRlc3RfYXJyYXlfZWxzZV9ib2R5QDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxODAKICAgIC8vIGR5ID0gcG9pbnQueSAtIGxhc3RfcG9pbnQueQogICAgZGlnIDMKICAgIGRpZyA2CiAgICAtCiAgICBiIHRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNAoKdGVzdF9hcnJheV9lbHNlX2JvZHlAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MgogICAgLy8gcG9pbnQgPSBwYXRoW3BvaW50X2lkeF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NgogICAgLy8gZHggPSBwb2ludC54LmFzX3VpbnQ2NCgpIC0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OQogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NgogICAgLy8gZHggPSBwb2ludC54LmFzX3VpbnQ2NCgpIC0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgYnVyeSA3CiAgICBiIHRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMQoKdGVzdF9hcnJheV9hZnRlcl9mb3JAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDQKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2V4dGVuZF9mcm9tX3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9leHRlbmRfZnJvbV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxNgogICAgc3dhcAogICAgZXh0cmFjdCAxNiAxNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2MgogICAgLy8gYXJyLmV4dGVuZChzb21lX21vcmUpCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjYzCiAgICAvLyBsYXN0ID0gYXJyWy0xXQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAxNgogICAgLwogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDE2CiAgICAqCiAgICBkaWcgMgogICAgc3dhcAogICAgaW50Y18zIC8vIDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjQKICAgIC8vIGFzc2VydCBsYXN0ID09IHNvbWVfbW9yZVsxXQogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjUKICAgIC8vIHJlc3VsdCA9IGFyci5mcmVlemUoKQogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY2CiAgICAvLyBhc3NlcnQgcmVzdWx0Wy0xXSA9PSBsYXN0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDE2CiAgICAqCiAgICBpbnRjXzMgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc0CiAgICAvLyBhcnIuZXh0ZW5kKHNvbWVfbW9yZSkKICAgIGR1cAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc1CiAgICAvLyByZXR1cm4gYXJyLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDE2CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYm9vbF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm9vbF9hcnJheToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3OQogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYm9vbF0oKQogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGludGNfMSAvLyAxCgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjgzCiAgICAvLyBhcnIuYXBwZW5kKGkgJSAyID09IDApCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgNAogICAgc3dhcAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjgyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JANToKICAgIGRpZyAyCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IGxlbmd0aCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgbGVuCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4NwogICAgLy8gYXJyMi5leHRlbmQoYXJyKQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojg4CiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gbGVuZ3RoICogMiwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkwCiAgICAvLyBjb3VudCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MQogICAgLy8gZm9yIHZhbCBpbiBhcnI6CiAgICBsZW4KICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTEKICAgIC8vIGZvciB2YWwgaW4gYXJyOgogICAgZGlnIDQKICAgIGRpZyA3CiAgICA8CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDExCiAgICBkaWcgMgogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTIKICAgIC8vIGlmIHZhbDoKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTMKICAgIC8vIGNvdW50ICs9IDEKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJANgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgNQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYXJjNF9jb252ZXJzaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcmM0X2NvbnZlcnNpb246CiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTgKICAgIC8vIGFyciA9IFJlZmVyZW5jZUFycmF5W2FyYzQuVUludDY0XSgpCiAgICBieXRlY18wIC8vIDB4CiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGludGNfMSAvLyAxCgp0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAyCiAgICAvLyBhcnIuYXBwZW5kKGFyYzQuVUludDY0KGkpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBidXJ5IDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJAMgoKdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDMKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IGxlbmd0aCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgZHVwCiAgICBidXJ5IDgKICAgIGRpZyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwNAogICAgLy8gY291bnQgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA1CiAgICAvLyBmb3IgdmFsIGluIGFycjoKICAgIGRpZyA0CiAgICBkaWcgNwogICAgPAogICAgYnogdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfZm9yQDExCiAgICBkaWcgMgogICAgZGlnIDUKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwNgogICAgLy8gaWYgdmFsOgogICAgYnl0ZWNfMCAvLyAweAogICAgYiE9CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA3CiAgICAvLyBjb3VudCArPSAxCiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNgoKdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckA2Cgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwOQogICAgLy8gYXJjNF9hcnIgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0oKQogICAgYnl0ZWMgNCAvLyAweDAwMDAKICAgIGRpZyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExMAogICAgLy8gYXJjNF9hcnIuZXh0ZW5kKGFycikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3Quc3VtX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExNwogICAgLy8gYXJyLmV4dGVuZChhcmM0X2FycikKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE5CiAgICAvLyB0b3RhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTIwCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBpbnRjXzAgLy8gMAoKc3VtX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTIwCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiBzdW1fYXJyYXlfYWZ0ZXJfZm9yQDUKICAgIGRpZyAzCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjEKICAgIC8vIHRvdGFsICs9IGl0ZW0uYXNfdWludDY0KCkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgKwogICAgYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHN1bV9hcnJheV9mb3JfaGVhZGVyQDIKCnN1bV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDMKICAgIC8vIGFyci5hcHBlbmQoYXJjNC5Cb29sKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSkKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0NAogICAgLy8gYXJyLmFwcGVuZChhcmM0LkJvb2woVHhuLnNlbmRlciAhPSBUeG4ucmVjZWl2ZXIpKQogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICAhPQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0NwogICAgLy8gZHluX2Fyci5leHRlbmQoYXJyKQogICAgbGVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0NgogICAgLy8gZHluX2FyciA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuQm9vbF0oKQogICAgYnl0ZWMgNCAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ3CiAgICAvLyBkeW5fYXJyLmV4dGVuZChhcnIpCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ4CiAgICAvLyBhc3NlcnQgZHluX2Fyci5sZW5ndGggPT0gMiwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDkKICAgIC8vIGFzc2VydCBkeW5fYXJyLmJ5dGVzLmxlbmd0aCA9PSAzLCAiZXhwZWN0ZWQgMyBieXRlcyIKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDMgYnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTUwCiAgICAvLyBhc3NlcnQgZHluX2FyclswXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwIgogICAgZHVwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMTYKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1MQogICAgLy8gYXNzZXJ0IGR5bl9hcnJbMV0gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMSIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMTcgLy8gMTcKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcmM0X2Jvb2xfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTQtMTU2CiAgICAvLyAjIG5vdGU6IG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5CiAgICAvLyAjIGFycjIuZXh0ZW5kKGR5bl9hcnJheSkKICAgIC8vIGZvciBiIGluIGR5bl9hcnI6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfYm9vbF9hZnRlcl9mb3JANQogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMTYKICAgICsKICAgIGRpZyA1CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTcKICAgIC8vIGFycjIuYXBwZW5kKGIpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfYm9vbF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9ib29sX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU4CiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1OQogICAgLy8gYXNzZXJ0IGFycjJbMF0gPT0gKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMCIKICAgIGR1cAogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjAKICAgIC8vIGFzc2VydCBhcnIyWzFdID09IChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDEiCiAgICBkdXAKICAgIGV4dHJhY3QgMSAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICAhPQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTYxCiAgICAvLyBhc3NlcnQgYXJyMlsyXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAyIgogICAgZHVwCiAgICBleHRyYWN0IDIgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2MgogICAgLy8gYXNzZXJ0IGFycjJbM10gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMyIKICAgIGV4dHJhY3QgMyAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICAhPQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDMKICAgIGRpZyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2NAogICAgLy8gcmV0dXJuIGFyci5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIGJ5dGVjIDQgLy8gMHgwMDAwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC54dHJhKCkgLT4gdWludDY0LCB1aW50NjQsIGJ5dGVzLCBieXRlcywgYnl0ZXM6Cnh0cmE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyNwogICAgLy8gc2VsZi5jb3VudCArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiY291bnQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTI5CiAgICAvLyBhPVR4bi5udW1fYXBwX2FyZ3MsCiAgICB0eG4gTnVtQXBwQXJncwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzEKICAgIC8vIGM9VHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTMyCiAgICAvLyBkPXNlbGYubW9yZSgpLAogICAgY2FsbHN1YiBtb3JlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEzMwogICAgLy8gZT1CaWdVSW50KHNlbGYuY291bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjgtMTM0CiAgICAvLyByZXR1cm4gWHRyYSgKICAgIC8vICAgICBhPVR4bi5udW1fYXBwX2FyZ3MsCiAgICAvLyAgICAgYj1zZWxmLmNvdW50LAogICAgLy8gICAgIGM9VHhuLnNlbmRlciwKICAgIC8vICAgICBkPXNlbGYubW9yZSgpLAogICAgLy8gICAgIGU9QmlnVUludChzZWxmLmNvdW50KSwKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgY292ZXIgNAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QubW9yZSgpIC0+IGJ5dGVzOgptb3JlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzgKICAgIC8vIHJldHVybiBNb3JlKGZvbz1hcmM0LlVJbnQ2NChzZWxmLmNvdW50ICsgMSksIGJhcj1hcmM0LlVJbnQ2NChzZWxmLmNvdW50ICogc2VsZi5jb3VudCkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291bnQgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBkaWcgMQogICAgdW5jb3ZlciAyCiAgICAqCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxNiAxNDQKICAgIGJ5dGVjYmxvY2sgMHggMHgxNTFmN2M3NSAiY291bnQiIDB4MDAgMHgwMDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM5CiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM3CiAgICAvLyBjbGFzcyBTdGF0aWNTaXplQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MjhkN2MxYjggMHhmYTljYjk3MyAweDYwMzlhMjQwIDB4ZjhmZDY4YTcgMHgxZjAyOGRiMSAweDA5NmIzYTU5IDB4OGQ2ZTNhMjUgLy8gbWV0aG9kICJ0ZXN0X2FycmF5KHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZXh0ZW5kX2Zyb21fdHVwbGUoKCh1aW50NjQsdWludDY0KSwodWludDY0LHVpbnQ2NCkpKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJ0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGUoKCh1aW50NjQsdWludDY0KSwodWludDY0LHVpbnQ2NCkpKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfYXJyYXkodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9hcmM0X2NvbnZlcnNpb24odWludDY0KXVpbnQ2NFtdIiwgbWV0aG9kICJzdW1fYXJyYXkodWludDY0W10pdWludDY0IiwgbWV0aG9kICJ0ZXN0X2FyYzRfYm9vbCgpYm9vbFtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9hcnJheSB0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlIHRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZSB0ZXN0X2Jvb2xfYXJyYXkgdGVzdF9hcmM0X2NvbnZlcnNpb24gc3VtX2FycmF5IHRlc3RfYXJjNF9ib29sCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgcmVhZF9zdGVwOiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzOgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgLQogICAgYnplcm8KICAgIGZyYW1lX2RpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheToKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDMKICAgIC8vIHNlbGYuY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ2CiAgICAvLyBQb2ludCh4PWFyYzQuVUludDY0KCksIHk9VUludDY0KCksIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIGNhbGxzdWIgeHRyYQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0NwogICAgLy8gUG9pbnQoeD14MSwgeT15MSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgY2FsbHN1YiB4dHJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ4CiAgICAvLyBQb2ludCh4PXgyLCB5PXkyLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICBjYWxsc3ViIHh0cmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDQtNTAKICAgIC8vIHBhdGggPSBSZWZlcmVuY2VBcnJheSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIFBvaW50KHg9YXJjNC5VSW50NjQoKSwgeT1VSW50NjQoKSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgLy8gICAgICAgICBQb2ludCh4PXgxLCB5PXkxLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICAvLyAgICAgICAgIFBvaW50KHg9eDIsIHk9eTIsIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgcHVzaGludCA2NCAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA2NCAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMTIKICAgIGRpZyAxCiAgICBifAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGxlbgogICAgcHVzaGludCA2NCAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA5CiAgICBkaWcgNAogICAgYnwKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCA2NCAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGJ8CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA8CiAgICBieiB0ZXN0X2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUyCiAgICAvLyBhc3NlcnQgcGF0aFtpXS5vdGhlci5iID09IGkgKyAxCiAgICBkdXAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGMgNCAvLyAxNDQKICAgICoKICAgIGludGMgNCAvLyAxNDQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAxNiAxMjgKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUzCiAgICAvLyBhc3NlcnQgcGF0aFtpXS5vdGhlci5kLmZvbyA9PSBpICsgMgogICAgc3dhcAogICAgZXh0cmFjdCA0OCAxNgogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgaXRvYgogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NTQKICAgIC8vIGFzc2VydCBwYXRoW2ldLm90aGVyLmQuYmFyID09IChpICsgMSkgKiAoaSArIDEpCiAgICBleHRyYWN0IDggOAogICAgZGlnIDEKICAgIGRpZyAyCiAgICAqCiAgICBpdG9iCiAgICBiPT0KICAgIGFzc2VydAogICAgYnVyeSAxCiAgICBiIHRlc3RfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2FycmF5X2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NTYKICAgIC8vIEJveChJbW11dGFibGVBcnJheVtQb2ludF0sIGtleT0iYSIpLnZhbHVlID0gcGF0aC5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIGludGMgNCAvLyAxNDQKICAgIC8KICAgIGR1cAogICAgYnVyeSAxMAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAiYSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgcHVzaGJ5dGVzICJhIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjkKICAgIC8vIGxhc3RfcG9pbnQgPSBwYXRoWzBdCiAgICBleHRyYWN0IDAgMTQ0IC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDExCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBidXJ5IDEwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzAKICAgIC8vIGxlbmd0aCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MQogICAgLy8gZm9yIHBvaW50X2lkeCBpbiB1cmFuZ2UoMSwgcGF0aC5sZW5ndGgpOgogICAgaW50Y18xIC8vIDEKICAgIGJ1cnkgMwoKdGVzdF9hcnJheV9mb3JfaGVhZGVyQDc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MQogICAgLy8gZm9yIHBvaW50X2lkeCBpbiB1cmFuZ2UoMSwgcGF0aC5sZW5ndGgpOgogICAgZGlnIDIKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X2FycmF5X2FmdGVyX2ZvckAxNQogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcyCiAgICAvLyBwb2ludCA9IHBhdGhbcG9pbnRfaWR4XQogICAgZGlnIDMKICAgIGludGMgNCAvLyAxNDQKICAgICoKICAgIGludGMgNCAvLyAxNDQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwbiAyCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTczCiAgICAvLyBpZiBwb2ludC54IDwgbGFzdF9wb2ludC54OgogICAgZGlnIDEwCiAgICBiPAogICAgYnogdGVzdF9hcnJheV9lbHNlX2JvZHlAMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc0CiAgICAvLyBkeCA9IGxhc3RfcG9pbnQueC5hc191aW50NjQoKSAtIHBvaW50LnguYXNfdWludDY0KCkKICAgIGRpZyAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjkKICAgIC8vIGxhc3RfcG9pbnQgPSBwYXRoWzBdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzQKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcyCiAgICAvLyBwb2ludCA9IHBhdGhbcG9pbnRfaWR4XQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc0CiAgICAvLyBkeCA9IGxhc3RfcG9pbnQueC5hc191aW50NjQoKSAtIHBvaW50LnguYXNfdWludDY0KCkKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICBidXJ5IDcKCnRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc3CiAgICAvLyBpZiBwb2ludC55IDwgbGFzdF9wb2ludC55OgogICAgZGlnIDMKICAgIGRpZyA2CiAgICA8CiAgICBieiB0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzgKICAgIC8vIGR5ID0gbGFzdF9wb2ludC55IC0gcG9pbnQueQogICAgZGlnIDUKICAgIGRpZyA0CiAgICAtCgp0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE4MQogICAgLy8gbGVuZ3RoICs9IG9wLnNxcnQoZHggKiBkeCArIGR5ICogZHkpCiAgICBkaWcgNwogICAgZHVwCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgICoKICAgICsKICAgIHNxcnQKICAgIGRpZyA1CiAgICArCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcxCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMwogICAgYiB0ZXN0X2FycmF5X2Zvcl9oZWFkZXJANwoKdGVzdF9hcnJheV9lbHNlX2JvZHlAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE4MAogICAgLy8gZHkgPSBwb2ludC55IC0gbGFzdF9wb2ludC55CiAgICBkaWcgMwogICAgZGlnIDYKICAgIC0KICAgIGIgdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDE0Cgp0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcyCiAgICAvLyBwb2ludCA9IHBhdGhbcG9pbnRfaWR4XQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc2CiAgICAvLyBkeCA9IHBvaW50LnguYXNfdWludDY0KCkgLSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTY5CiAgICAvLyBsYXN0X3BvaW50ID0gcGF0aFswXQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc2CiAgICAvLyBkeCA9IHBvaW50LnguYXNfdWludDY0KCkgLSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICBidXJ5IDcKICAgIGIgdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDExCgp0ZXN0X2FycmF5X2FmdGVyX2ZvckAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgNAogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfZXh0ZW5kX2Zyb21fdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgZXh0cmFjdCAwIDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDE2IDE2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjYyCiAgICAvLyBhcnIuZXh0ZW5kKHNvbWVfbW9yZSkKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjMKICAgIC8vIGxhc3QgPSBhcnJbLTFdCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDE2CiAgICAvCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzMgLy8gMTYKICAgICoKICAgIGRpZyAyCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2NAogICAgLy8gYXNzZXJ0IGxhc3QgPT0gc29tZV9tb3JlWzFdCiAgICBkdXAKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2NQogICAgLy8gcmVzdWx0ID0gYXJyLmZyZWV6ZSgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjYKICAgIC8vIGFzc2VydCByZXN1bHRbLTFdID09IGxhc3QKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyAxNgogICAgKgogICAgaW50Y18zIC8vIDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NAogICAgLy8gYXJyLmV4dGVuZChzb21lX21vcmUpCiAgICBkdXAKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NQogICAgLy8gcmV0dXJuIGFyci5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAxNgogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2Jvb2xfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NzkKICAgIC8vIGFyciA9IFJlZmVyZW5jZUFycmF5W2Jvb2xdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODIKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzEgLy8gMQoKdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODIKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MwogICAgLy8gYXJyLmFwcGVuZChpICUgMiA9PSAwKQogICAgZHVwbiAyCiAgICBwdXNoaW50IDIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDQKICAgIHN3YXAKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojg0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODcKICAgIC8vIGFycjIuZXh0ZW5kKGFycikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4OAogICAgLy8gYXNzZXJ0IGFycjIubGVuZ3RoID09IGxlbmd0aCAqIDIsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MAogICAgLy8gY291bnQgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTEKICAgIC8vIGZvciB2YWwgaW4gYXJyOgogICAgbGVuCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKCnRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkxCiAgICAvLyBmb3IgdmFsIGluIGFycjoKICAgIGRpZyA0CiAgICBkaWcgNwogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckAxMQogICAgZGlnIDIKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkyCiAgICAvLyBpZiB2YWw6CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkzCiAgICAvLyBjb3VudCArPSAxCiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOToKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIHRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDYKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDUKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FyYzRfY29udmVyc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jb252ZXJzaW9uOgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojk4CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVthcmM0LlVJbnQ2NF0oKQogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzEgLy8gMQoKdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMgogICAgLy8gYXJyLmFwcGVuZChhcmM0LlVJbnQ2NChpKSkKICAgIGR1cG4gMgogICAgaXRvYgogICAgZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckA1OgogICAgZGlnIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgYnVyeSA4CiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDQKICAgIC8vIGNvdW50ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwNQogICAgLy8gZm9yIHZhbCBpbiBhcnI6CiAgICBkaWcgNAogICAgZGlnIDcKICAgIDwKICAgIGJ6IHRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckAxMQogICAgZGlnIDIKICAgIGRpZyA1CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDYKICAgIC8vIGlmIHZhbDoKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGIhPQogICAgYnogdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwNwogICAgLy8gY291bnQgKz0gMQogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2lmX2Vsc2VAOToKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIHRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJANgoKdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfZm9yQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDkKICAgIC8vIGFyYzRfYXJyID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKCkKICAgIGJ5dGVjIDQgLy8gMHgwMDAwCiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTAKICAgIC8vIGFyYzRfYXJyLmV4dGVuZChhcnIpCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnN1bV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnN1bV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTcKICAgIC8vIGFyci5leHRlbmQoYXJjNF9hcnIpCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExOQogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyMAogICAgLy8gZm9yIGl0ZW0gaW4gYXJyOgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgaW50Y18wIC8vIDAKCnN1bV9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyMAogICAgLy8gZm9yIGl0ZW0gaW4gYXJyOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogc3VtX2FycmF5X2FmdGVyX2ZvckA1CiAgICBkaWcgMwogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTIxCiAgICAvLyB0b3RhbCArPSBpdGVtLmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgICsKICAgIGJ1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fYXJyYXlfZm9yX2hlYWRlckAyCgpzdW1fYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQzCiAgICAvLyBhcnIuYXBwZW5kKGFyYzQuQm9vbChUeG4uc2VuZGVyID09IFR4bi5yZWNlaXZlcikpCiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDQKICAgIC8vIGFyci5hcHBlbmQoYXJjNC5Cb29sKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSkKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDcKICAgIC8vIGR5bl9hcnIuZXh0ZW5kKGFycikKICAgIGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDYKICAgIC8vIGR5bl9hcnIgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LkJvb2xdKCkKICAgIGJ5dGVjIDQgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0NwogICAgLy8gZHluX2Fyci5leHRlbmQoYXJyKQogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYml0cwogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0OAogICAgLy8gYXNzZXJ0IGR5bl9hcnIubGVuZ3RoID09IDIsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDkKICAgIC8vIGFzc2VydCBkeW5fYXJyLmJ5dGVzLmxlbmd0aCA9PSAzLCAiZXhwZWN0ZWQgMyBieXRlcyIKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDMgYnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTUwCiAgICAvLyBhc3NlcnQgZHluX2FyclswXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwIgogICAgZHVwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMTYKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1MQogICAgLy8gYXNzZXJ0IGR5bl9hcnJbMV0gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMSIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMTcgLy8gMTcKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcmM0X2Jvb2xfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTQtMTU2CiAgICAvLyAjIG5vdGU6IG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5CiAgICAvLyAjIGFycjIuZXh0ZW5kKGR5bl9hcnJheSkKICAgIC8vIGZvciBiIGluIGR5bl9hcnI6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfYm9vbF9hZnRlcl9mb3JANQogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMTYKICAgICsKICAgIGRpZyA1CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTcKICAgIC8vIGFycjIuYXBwZW5kKGIpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfYm9vbF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9ib29sX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU4CiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1OQogICAgLy8gYXNzZXJ0IGFycjJbMF0gPT0gKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMCIKICAgIGR1cAogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjAKICAgIC8vIGFzc2VydCBhcnIyWzFdID09IChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDEiCiAgICBkdXAKICAgIGV4dHJhY3QgMSAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICAhPQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTYxCiAgICAvLyBhc3NlcnQgYXJyMlsyXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAyIgogICAgZHVwCiAgICBleHRyYWN0IDIgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2MgogICAgLy8gYXNzZXJ0IGFycjJbM10gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMyIKICAgIGV4dHJhY3QgMyAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICAhPQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDMKICAgIGRpZyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2NAogICAgLy8gcmV0dXJuIGFyci5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIGJ5dGVjIDQgLy8gMHgwMDAwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC54dHJhKCkgLT4gdWludDY0LCB1aW50NjQsIGJ5dGVzLCBieXRlcywgYnl0ZXM6Cnh0cmE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyNwogICAgLy8gc2VsZi5jb3VudCArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiY291bnQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTI5CiAgICAvLyBhPVR4bi5udW1fYXBwX2FyZ3MsCiAgICB0eG4gTnVtQXBwQXJncwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzEKICAgIC8vIGM9VHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTMyCiAgICAvLyBkPXNlbGYubW9yZSgpLAogICAgY2FsbHN1YiBtb3JlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEzMwogICAgLy8gZT1CaWdVSW50KHNlbGYuY291bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjgtMTM0CiAgICAvLyByZXR1cm4gWHRyYSgKICAgIC8vICAgICBhPVR4bi5udW1fYXBwX2FyZ3MsCiAgICAvLyAgICAgYj1zZWxmLmNvdW50LAogICAgLy8gICAgIGM9VHhuLnNlbmRlciwKICAgIC8vICAgICBkPXNlbGYubW9yZSgpLAogICAgLy8gICAgIGU9QmlnVUludChzZWxmLmNvdW50KSwKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgY292ZXIgNAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QubW9yZSgpIC0+IGJ5dGVzOgptb3JlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzgKICAgIC8vIHJldHVybiBNb3JlKGZvbz1hcmM0LlVJbnQ2NChzZWxmLmNvdW50ICsgMSksIGJhcj1hcmM0LlVJbnQ2NChzZWxmLmNvdW50ICogc2VsZi5jb3VudCkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291bnQgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBkaWcgMQogICAgdW5jb3ZlciAyCiAgICAqCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyAFAAEIEJABJgUABBUffHUFY291bnQBAAIAADEYQAADKiJnMRtBAEAxGRREMRhEggcEKNfBuAT6nLlzBGA5okAE+P1opwQfAo2xBAlrOlkEjW46JTYaAI4HAIEB+QI8AlECyAM6A20AMRkUMRgUEEOKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJApJTwKBBwgkCklOAgxBAAyLBosFCa+LBExQjAQijACLAyUISYwCi/4IjAGLAosBDEEAIIv9iwBJTgJTiwSLAklOA08CVIwEIwiMAov/CIwAQv/YiwSMAIkiSShHBTYaATYaAhc2GgM2GgQXKiJniAOhiAOeiAObTw4WTw4WUE8NUE8MUEsLFYFADkSBQK9PDEsBq08CTFCAEAAAAAAAAAAAAAAAAAAAAABMUE8OFk8PTFBPDBZPDBZQTwtQTwpQSwkVgUAORE8JSwSrUFBQTwcWTwhMUE8HFk8HFlBPBlBPBVBLBBWBQA5ETwRPBKtQUFAiSYEDDEEAOUpJTgIhBAshBFhXEIBJJFtLAiMITEsBEkRMVzAQSVcACE8DgQIIFqhEVwgISwFLAgsWqERFAUL/wEsBSRUhBApJRQoWVwYCSwFQgAFhvEiAAWFMv1cAkElFC0lXAAhFCiRbRQYiRQUjRQNLAksIDEEAXEsBSwMhBAshBFhHAlcACEwkW0UGSwqkQQA2SwoiW0wiWwlFB0sDSwYMQQAcSwVLBAlLB0kLTEkLCJJLBQhFBUsCIwhFA0L/sEsDSwYJQv/hIltLCiJbCUUHQv/ISwQWKUxQsCNDNhoBSVcAEExXEBBMSwFQSRUlCkkjCSULSwJMJVhJTwQSREwWVwYCTwJQSSJZIwlLAVcCAEwlCyVYTwISRClMULAjQzYaAUlISRUlChZXBgJMUClMULAjQyhHAjYaARdJKEwjCCNJSwIMQQAYRwKBAhgUSwRMKyJPAlRQRQQjCEUBQv/hSwJHAhVLBklOBBJESwFQFU8CgQILEkQiRQcVRQciRQVLBEsHDEEAGksCSwUjWCJTQQAGSwUjCEUGSwQjCEUFQv/eSwUWKUxQsCNDKEcCNhoBF0koTCMII0lLAgxBABBHAhZLBExQRQQjCEUBQv/pSwIVJApJRQhLBBJEIkUGIkUFSwRLBwxBABxLAksFJAskWCipQQAGSwUjCEUGSwQjCEUFQv/cJwRLA1BJVwIAFSQKFlcGAlwAKUxQsCNDNhoBVwIASSJMFSQKIklLAgxBABZLA0sBSU4CJAtbSwQIRQQjCEUBQv/jSwIWKUxQsCNDMQAxBxIrIk8CVDEAMQcTKyJPAlRQRwIVJwRLAk8CJIj8eklOAkkiWUlOA0mBAhJESwEVgQMSRElESwElUysiTwJUIlMxADEHEhJEIw1EgRFTKyJPAlQiUzEAMQcTEkQiSUsDDEEAGkcCJQhLBUxTKyJPAlRLA0xQRQMjCEUBQv/fSwFJFYEEEkRJVwABIlMxADEHEhJESVcBASJTMQAxBxMSRElXAgEiUzEAMQcSEkRXAwEiUzEAMQcTEkRLBEkVJwROAiSI+9QpTFCwI0MiKmVEIwgqSwFnMRsxAIgACiIqZUQWTwNOBIkiKmVESSMIFksBTwILFlCJ", + "approval": "CyAFAAEIEJABJgUABBUffHUFY291bnQBAAIAADEYQAADKiJnMRtBAEAxGRREMRhEggcEKNfBuAT6nLlzBGA5okAE+P1opwQfAo2xBAlrOlkEjW46JTYaAI4HAIMB+wI+AlMCygM8A28AMRkUMRgUEEQjQ4oEAShHAov8IllHAov+CEkWVwYAi/xMXABOAkyBBwgkCklPAoEHCCQKSU4CDEEADIsGiwUJr4sETFCMBCKMAIsDJQhJjAKL/giMAYsCiwEMQQAgi/2LAElOAlOLBIsCSU4DTwJUjAQjCIwCi/8IjABC/9iLBIwAiSJJKEcFNhoBNhoCFzYaAzYaBBcqImeIA6GIA56IA5tPDhZPDhZQTw1QTwxQSwsVgUAORIFAr08MSwGrTwJMUIAQAAAAAAAAAAAAAAAAAAAAAExQTw4WTw9MUE8MFk8MFlBPC1BPClBLCRWBQA5ETwlLBKtQUFBPBxZPCExQTwcWTwcWUE8GUE8FUEsEFYFADkRPBE8Eq1BQUCJJgQMMQQA5SklOAiEECyEEWFcQgEkkW0sCIwhMSwESRExXMBBJVwAITwOBAggWqERXCAhLAUsCCxaoREUBQv/ASwFJFSEECklFChZXBgJLAVCAAWG8SIABYUy/VwCQSUULSVcACEUKJFtFBiJFBSNFA0sCSwgMQQBcSwFLAyEECyEEWEcCVwAITCRbRQZLCqRBADZLCiJbTCJbCUUHSwNLBgxBABxLBUsECUsHSQtMSQsIkksFCEUFSwIjCEUDQv+wSwNLBglC/+EiW0sKIlsJRQdC/8hLBBYpTFCwI0M2GgFJVwAQTFcQEExLAVBJFSUKSSMJJQtLAkwlWElPBBJETBZXBgJPAlBJIlkjCUsBVwIATCULJVhPAhJEKUxQsCNDNhoBSUhJFSUKFlcGAkxQKUxQsCNDKEcCNhoBF0koTCMII0lLAgxBABhHAoECGBRLBEwrIk8CVFBFBCMIRQFC/+FLAkcCFUsGSU4EEkRLAVAVTwKBAgsSRCJFBxVFByJFBUsESwcMQQAaSwJLBSNYIlNBAAZLBSMIRQZLBCMIRQVC/95LBRYpTFCwI0MoRwI2GgEXSShMIwgjSUsCDEEAEEcCFksETFBFBCMIRQFC/+lLAhUkCklFCEsEEkQiRQYiRQVLBEsHDEEAHEsCSwUkCyRYKKlBAAZLBSMIRQZLBCMIRQVC/9wnBEsDUElXAgAVJAoWVwYCXAApTFCwI0M2GgFXAgBJIkwVJAoiSUsCDEEAFksDSwFJTgIkC1tLBAhFBCMIRQFC/+NLAhYpTFCwI0MxADEHEisiTwJUMQAxBxMrIk8CVFBHAhUnBEsCTwIkiPx6SU4CSSJZSU4DSYECEkRLARWBAxJESURLASVTKyJPAlQiUzEAMQcSEkQjDUSBEVMrIk8CVCJTMQAxBxMSRCJJSwMMQQAaRwIlCEsFTFMrIk8CVEsDTFBFAyMIRQFC/99LAUkVgQQSRElXAAEiUzEAMQcSEkRJVwEBIlMxADEHExJESVcCASJTMQAxBxISRFcDASJTMQAxBxMSREsESRUnBE4CJIj71ClMULAjQyIqZUQjCCpLAWcxGzEAiAAKIiplRBZPA04EiSIqZURJIwgWSwFPAgsWUIk=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/Arrays/immutable.py b/tests/artifacts/Arrays/immutable.py index 6754a4f..3f575d0 100644 --- a/tests/artifacts/Arrays/immutable.py +++ b/tests/artifacts/Arrays/immutable.py @@ -155,6 +155,7 @@ def test_biguint_array(self) -> None: @arc4.abimethod() def test_bool_array(self, length: UInt64) -> None: arr = ImmutableArray[bool]() + arr.validate() # does nothing but should still be callable assert arr.length == 0 for i in urange(length): diff --git a/tests/artifacts/BoxContract/data/BoxContract.approval.teal b/tests/artifacts/BoxContract/data/BoxContract.approval.teal index b1e8979..eeb0a32 100644 --- a/tests/artifacts/BoxContract/data/BoxContract.approval.teal +++ b/tests/artifacts/BoxContract/data/BoxContract.approval.teal @@ -68,7 +68,9 @@ main___algopy_default_create@34: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.BoxContract.contract.BoxContract.store_enums[routing]() -> void: diff --git a/tests/artifacts/BoxContract/data/BoxContract.arc56.json b/tests/artifacts/BoxContract/data/BoxContract.arc56.json index fbdedc2..da02a1e 100644 --- a/tests/artifacts/BoxContract/data/BoxContract.arc56.json +++ b/tests/artifacts/BoxContract/data/BoxContract.arc56.json @@ -665,89 +665,89 @@ }, { "pc": [ - 840 + 842 ], "errorMessage": "check Box exists" }, { "pc": [ - 486 + 488 ], "errorMessage": "check self.box_a exists" }, { "pc": [ - 849 + 851 ], "errorMessage": "check self.box_b exists" }, { "pc": [ - 514, - 855 + 516, + 857 ], "errorMessage": "check self.box_c exists" }, { "pc": [ - 1928 + 1930 ], "errorMessage": "check self.box_map entry exists" }, { "pc": [ - 1174 + 1176 ], "errorMessage": "check self.many_ints exists" }, { "pc": [ - 378 + 380 ], "errorMessage": "check self.oca exists" }, { "pc": [ - 1791 + 1793 ], "errorMessage": "check self.too_many_bools exists" }, { "pc": [ - 390 + 392 ], "errorMessage": "check self.txn exists" }, { "pc": [ - 1769 + 1771 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 1394, - 1421, - 1488, - 1513, - 1535, - 1583, - 1610, - 1656, - 1681, - 1706 + 1396, + 1423, + 1490, + 1515, + 1537, + 1585, + 1612, + 1658, + 1683, + 1708 ], "errorMessage": "index out of bounds" }, { "pc": [ - 1224 + 1226 ], "errorMessage": "no data" }, { "pc": [ - 1325 + 1327 ], "errorMessage": "struct.a is truthy" } @@ -760,19 +760,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDIgMCA4IDQwOTYgNDA5OCA0MTM4CiAgICBieXRlY2Jsb2NrICJib3giIDB4NDI0ZjU4NWY0MyAiYmxvYiIgImJveF9sYXJnZSIgMHgxNTFmN2M3NSAiYm94X2EiICJib3hfZCIgImIiICJ0b29fbWFueV9ib29scyIgIm1hbnlfaW50cyIgIjAiIDB4MDAwMjM0MzIgMHg2ODY1NmM2YzZmIDB4NmY2MzYxIDB4NzQ3ODZlIDB4MDY4MTAxICJib3hfcmVmIiAiZGVmYXVsdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo1OQogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGYyNmM2ZDQyIDB4ZWYxODZjZjcgMHg3ZDM3Mjk2ZSAweGYxM2RkOTM3IDB4MzMzMjVkM2QgMHhhNjE3NDgxMiAweGZhYmNiODg1IDB4ZDU2NmM2MzIgMHgwNGVmNDk3MSAweDIzZWNiMzJjIDB4MDE5OTQwOGQgMHg3NzIwNTljYSAweDAxMjYzZGY2IDB4ZWVmNzU4MTYgMHg5OTY0OTdhZSAweDZjZWM3MmZmIDB4NmY5ZDEwNzUgMHg1OWVmMzc2MCAweGFhNjY2Yjk2IDB4ZGZiZGQ2MzYgMHhiNTMyOTEzYSAweGMyOWYxNjY5IDB4OWM4ODhjMDkgMHhlNmY2ODUwNiAweDhlZTJjMzY0IC8vIG1ldGhvZCAic3RvcmVfZW51bXMoKXZvaWQiLCBtZXRob2QgInJlYWRfZW51bXMoKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAic2V0X2JveGVzKHVpbnQ2NCxieXRlW10sc3RyaW5nKXZvaWQiLCBtZXRob2QgImJveGVzX2V4aXN0KCkoYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgImNoZWNrX2tleXMoKXZvaWQiLCBtZXRob2QgInJlYWRfYm94ZXMoKSh1aW50NjQsYnl0ZVtdLHN0cmluZyx1aW50NjQpIiwgbWV0aG9kICJpbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlKCl2b2lkIiwgbWV0aG9kICJkZWxldGVfYm94ZXMoKXZvaWQiLCBtZXRob2QgInNsaWNlX2JveCgpdm9pZCIsIG1ldGhvZCAiYXJjNF9ib3goKXZvaWQiLCBtZXRob2QgImNyZWF0ZV9tYW55X2ludHMoKXZvaWQiLCBtZXRob2QgInNldF9tYW55X2ludHModWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzdW1fbWFueV9pbnRzKCl1aW50NjQiLCBtZXRob2QgInRlc3RfYm94X3JlZigpdm9pZCIsIG1ldGhvZCAic2V0X25lc3RlZF9zdHJ1Y3QoKHVpbnQ2NCwodWludDY0LHVpbnQ2NFtdW10sdWludDY0KSwodWludDY0LHVpbnQ2NFtdW10sdWludDY0KVtdLHVpbnQ2NCkpdm9pZCIsIG1ldGhvZCAibmVzdGVkX3dyaXRlKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAibmVzdGVkX3JlYWQodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJjcmVhdGVfYm9vbHMoKXZvaWQiLCBtZXRob2QgInNldF9ib29sKHVpbnQ2NCxib29sKXZvaWQiLCBtZXRob2QgInN1bV9ib29scyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJib3hfbWFwX3Rlc3QoKXZvaWQiLCBtZXRob2QgImJveF9tYXBfc2V0KHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiYm94X21hcF9nZXQodWludDY0KXN0cmluZyIsIG1ldGhvZCAiYm94X21hcF9kZWwodWludDY0KXZvaWQiLCBtZXRob2QgImJveF9tYXBfZXhpc3RzKHVpbnQ2NClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc3RvcmVfZW51bXMgcmVhZF9lbnVtcyBzZXRfYm94ZXMgYm94ZXNfZXhpc3QgbWFpbl9jaGVja19rZXlzX3JvdXRlQDEwIHJlYWRfYm94ZXMgaW5kaXJlY3RfZXh0cmFjdF9hbmRfcmVwbGFjZSBkZWxldGVfYm94ZXMgc2xpY2VfYm94IG1haW5fYXJjNF9ib3hfcm91dGVAMTUgbWFpbl9jcmVhdGVfbWFueV9pbnRzX3JvdXRlQDE2IHNldF9tYW55X2ludHMgc3VtX21hbnlfaW50cyB0ZXN0X2JveF9yZWYgc2V0X25lc3RlZF9zdHJ1Y3QgbmVzdGVkX3dyaXRlIG5lc3RlZF9yZWFkIG1haW5fY3JlYXRlX2Jvb2xzX3JvdXRlQDIzIHNldF9ib29sIHN1bV9ib29scyBib3hfbWFwX3Rlc3QgYm94X21hcF9zZXQgYm94X21hcF9nZXQgYm94X21hcF9kZWwgYm94X21hcF9leGlzdHMKICAgIGVycgoKbWFpbl9jcmVhdGVfYm9vbHNfcm91dGVAMjM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgxCiAgICAvLyBzZWxmLnRvb19tYW55X2Jvb2xzLmNyZWF0ZSgpCiAgICBieXRlYyA4IC8vICJ0b29fbWFueV9ib29scyIKICAgIHB1c2hpbnQgNDEyNSAvLyA0MTI1CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfbWFueV9pbnRzX3JvdXRlQDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4MQogICAgLy8gc2VsZi5tYW55X2ludHMuY3JlYXRlKCkKICAgIGJ5dGVjIDkgLy8gIm1hbnlfaW50cyIKICAgIHB1c2hpbnQgNDEwNCAvLyA0MTA0CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzRfYm94X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzcyAweDY0IDB4MDAwMTAyMDMgLy8gMHg2NCwgMHgwMDAxMDIwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MgogICAgLy8gYm94X2QudmFsdWUgPSBTdGF0aWNJbnRzKGFyYzQuVUludDgoMCksIGFyYzQuVUludDgoMSksIGFyYzQuVUludDgoMiksIGFyYzQuVUludDgoMykpCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hlY2tfa2V5c19yb3V0ZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzNDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdG9yZV9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN0b3JlX2VudW1zOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLm9jYS52YWx1ZSA9IE9uQ29tcGxldGVBY3Rpb24uT3B0SW4KICAgIGludGNfMCAvLyBPcHRJbgogICAgaXRvYgogICAgYnl0ZWMgMTMgLy8gIm9jYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3NgogICAgLy8gc2VsZi50eG4udmFsdWUgPSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXRvYgogICAgYnl0ZWMgMTQgLy8gInR4biIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfZW51bXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODAKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIib2NhIilbMF0gPT0gb3AuaXRvYihzZWxmLm9jYS52YWx1ZSkKICAgIGJ5dGVjIDEzIC8vIDB4NmY2MzYxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vY2EgZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODEKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIidHhuIilbMF0gPT0gb3AuaXRvYihzZWxmLnR4bi52YWx1ZSkKICAgIGJ5dGVjIDE0IC8vIDB4NzQ3ODZlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50eG4gZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NChzZWxmLm9jYS52YWx1ZSksIGFyYzQuVUludDY0KHNlbGYudHhuLnZhbHVlKSkpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSA9IGEKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuYm94X2IudmFsdWUgPSBiLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODkKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBjCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MAogICAgLy8gc2VsZi5ib3hfZC52YWx1ZSA9IGIubmF0aXZlCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTEKICAgIC8vIHNlbGYuYm94X2xhcmdlLmNyZWF0ZSgpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBwdXNoaW50IDYxNjAgLy8gNjE2MAogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYuYm94X2xhcmdlLnZhbHVlLmUgPSBVSW50NjQoNDIpCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBpbnRjIDQgLy8gNDA5NgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjkzCiAgICAvLyBzZWxmLmJveF9sYXJnZS5yZXBsYWNlKHNpemVfb2YoQnl0ZXMxMDI0KSAqIDQsIGFyYzQuVUludDY0KDQyKS5ieXRlcykKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGludGMgNCAvLyA0MDk2CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDJhCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBzZWxmLmJveF9hLnZhbHVlICs9IDMKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2EgZXhpc3RzCiAgICBidG9pCiAgICBwdXNoaW50IDMgLy8gMwogICAgKwogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTAwLTEwMQogICAgLy8gIyB0ZXN0IC5sZW5ndGgKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmxlbmd0aCA9PSA4CiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9sZW4KICAgIHBvcAogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDIKICAgIC8vIGFzc2VydCBzZWxmLmJveF9iLmxlbmd0aCA9PSBiLmJ5dGVzLmxlbmd0aAogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9sZW4KICAgIHBvcAogICAgZGlnIDMKICAgIGxlbgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwMwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MubGVuZ3RoID09IGMuYnl0ZXMubGVuZ3RoCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2MgZXhpc3RzCiAgICBkaWcgMgogICAgbGVuCiAgICBkdXAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTA0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC5sZW5ndGggPT0gYi5uYXRpdmUubGVuZ3RoCiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGJveF9sZW4KICAgIHBvcAogICAgZGlnIDMKICAgIGxlbgogICAgZHVwMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwNi0xMDcKICAgIC8vICMgdGVzdCAudmFsdWUuYnl0ZXMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzBdID09IGMuYnl0ZXNbMF0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgNgogICAgZXh0cmFjdCAwIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDgKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWy0xXSA9PSBjLmJ5dGVzWy0xXQogICAgZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGRpZyA3CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgZXh0cmFjdDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzotMV0gPT0gYy5ieXRlc1s6LTFdCiAgICBpbnRjXzAgLy8gMQogICAgZGlnIDQKICAgIDwKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICBzd2FwCiAgICAtCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICBzd2FwCiAgICAtCiAgICBkaWcgNwogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExMAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbOjJdID09IGMuYnl0ZXNbOjJdCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDQKICAgIDwKICAgIHVuY292ZXIgNAogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMSAvLyAyCiAgICBkaWcgNAogICAgPj0KICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDUKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMTItMTEzCiAgICAvLyAjIHRlc3QgLnZhbHVlIHdpdGggQnl0ZXMgdHlwZQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbMF0gPT0gYi5uYXRpdmVbMF0KICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgaW50Y18yIC8vIDAKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgdW5jb3ZlciA0CiAgICBleHRyYWN0IDIgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExNAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbLTFdID09IGIubmF0aXZlWy0xXQogICAgZGlnIDEKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDEKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkaWcgNAogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgIGV4dHJhY3QzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE1CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6LTFdID09IGIubmF0aXZlWzotMV0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgMgogICAgPAogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICBzd2FwCiAgICAtCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExNgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOjVdID09IGIubmF0aXZlWzo1XQogICAgcHVzaGludCA1IC8vIDUKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgcHVzaGludCA1IC8vIDUKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoaW50IDUgLy8gNQogICAgZGlnIDIKICAgID49CiAgICBwdXNoaW50IDUgLy8gNQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2xhcmdlLmxlbmd0aCA9PSBzaXplX29mKExhcmdlU3RydWN0KQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgYm94X2xlbgogICAgcG9wCiAgICBwdXNoaW50IDYxNjAgLy8gNjE2MAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94ZXNfZXhpc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpib3hlc19leGlzdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMjMKICAgIC8vIHJldHVybiBib29sKHNlbGYuYm94X2EpLCBib29sKHNlbGYuYm94X2IpLCBib29sKHNlbGYuYm94X2MpLCBib29sKHNlbGYuYm94X2xhcmdlKQogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfbGVuCiAgICBjb3ZlciAyCiAgICBwb3AKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBjb3ZlciAzCiAgICBwb3AKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGJveF9sZW4KICAgIGNvdmVyIDQKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgcHVzaGludCAzIC8vIDMKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnJlYWRfYm94ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyZWFkX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzNQogICAgLy8gZ2V0X2JveF92YWx1ZV9wbHVzXzEoc2VsZi5ib3hfYSkgLSAxLAogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzQ1CiAgICAvLyByZXR1cm4gYm94LnZhbHVlICsgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM1CiAgICAvLyBnZXRfYm94X3ZhbHVlX3BsdXNfMShzZWxmLmJveF9hKSAtIDEsCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzNgogICAgLy8gc2VsZi5ib3hfYi52YWx1ZS5uYXRpdmUsCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2IgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzNwogICAgLy8gc2VsZi5ib3hfYy52YWx1ZSwKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzgKICAgIC8vIHNlbGYuYm94X2xhcmdlLnZhbHVlLmUsCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBpbnRjIDQgLy8gNDA5NgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDE0CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5pbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKaW5kaXJlY3RfZXh0cmFjdF9hbmRfcmVwbGFjZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDMKICAgIC8vIGxhcmdlID0gc2VsZi5ib3hfbGFyZ2UudmFsdWUuY29weSgpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQzLTE0NAogICAgLy8gbGFyZ2UgPSBzZWxmLmJveF9sYXJnZS52YWx1ZS5jb3B5KCkKICAgIC8vIGxhcmdlLmUgKz0gMQogICAgaW50YyA0IC8vIDQwOTYKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0NAogICAgLy8gbGFyZ2UuZSArPSAxCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0NQogICAgLy8gc2VsZi5ib3hfbGFyZ2UudmFsdWUgPSBsYXJnZS5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDMtMTQ1CiAgICAvLyBsYXJnZSA9IHNlbGYuYm94X2xhcmdlLnZhbHVlLmNvcHkoKQogICAgLy8gbGFyZ2UuZSArPSAxCiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZSA9IGxhcmdlLmNvcHkoKQogICAgaW50YyA0IC8vIDQwOTYKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmRlbGV0ZV9ib3hlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZV9ib3hlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDkKICAgIC8vIGRlbCBzZWxmLmJveF9hLnZhbHVlCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1MAogICAgLy8gZGVsIHNlbGYuYm94X2IudmFsdWUKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTEKICAgIC8vIGRlbCBzZWxmLmJveF9jLnZhbHVlCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUyCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYS5nZXQoZGVmYXVsdD1VSW50NjQoNDIpKSA9PSA0MgogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBkaWcgMQogICAgZGlnIDMKICAgIHNlbGVjdAogICAgcHVzaGludCA0MiAvLyA0MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1MwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IuZ2V0KGRlZmF1bHQ9YXJjNC5EeW5hbWljQnl0ZXMoYiI0MiIpKS5uYXRpdmUgPT0gYiI0MiIKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMSAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgMHgzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTU0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5nZXQoZGVmYXVsdD1hcmM0LlN0cmluZygiNDIiKSkgPT0gIjQyIgogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9nZXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMjM0MzIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAyMzQzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1NgogICAgLy8gYXNzZXJ0IG5vdCBhX2V4aXN0cwogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTU3CiAgICAvLyBhc3NlcnQgYSA9PSAwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTgKICAgIC8vIGRlbCBzZWxmLmJveF9sYXJnZS52YWx1ZQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2xpY2VfYm94W3JvdXRpbmddKCkgLT4gdm9pZDoKc2xpY2VfYm94OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYm94XzAgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoIjAiKSkKICAgIGJ5dGVjIDEwIC8vICIwIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2MwogICAgLy8gYm94XzAudmFsdWUgPSBCeXRlcyhiIlRlc3RpbmcgdGVzdGluZyAxMjMiKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYzCiAgICAvLyBib3hfMC52YWx1ZSA9IEJ5dGVzKGIiVGVzdGluZyB0ZXN0aW5nIDEyMyIpCiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NzIwNzQ2NTczNzQ2OTZlNjcyMDMxMzIzMwogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYm94XzAgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoIjAiKSkKICAgIGJ5dGVjIDEwIC8vICIwIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYXNzZXJ0IGJveF8wLnZhbHVlWzA6N10gPT0gYiJUZXN0aW5nIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkdXAKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDcgLy8gNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYm94XzAgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoIjAiKSkKICAgIGJ5dGVjIDEwIC8vICIwIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYXNzZXJ0IGJveF8wLnZhbHVlWzA6N10gPT0gYiJUZXN0aW5nIgogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY2CiAgICAvLyBzZWxmLmJveF9jLnZhbHVlID0gYXJjNC5TdHJpbmcoIkhlbGxvIikKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBwdXNoYnl0ZXMgMHgwMDA1NDg2NTZjNmM2ZgogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2NwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMjoxMF0gPT0gYiJIZWxsbyIKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMSAvLyAyCiAgICBkaWcgMQogICAgPAogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxCiAgICAtCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIHB1c2hieXRlcyAweDQ4NjU2YzZjNmYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfbWFueV9pbnRzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X21hbnlfaW50czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTg1CiAgICAvLyBzZWxmLm1hbnlfaW50cy52YWx1ZVtpbmRleF0gPSB2YWx1ZQogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGJ5dGVjIDkgLy8gIm1hbnlfaW50cyIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnN1bV9tYW55X2ludHNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fbWFueV9pbnRzOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKCnN1bV9tYW55X2ludHNfd2hpbGVfdG9wQDc6CiAgICBwdXNoaW50IDEwNTEwIC8vIDEwNTEwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBzdW1fbWFueV9pbnRzX2FmdGVyX3doaWxlQDEyCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMTUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAxNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgaW50Y18yIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBzdW1fbWFueV9pbnRzX3doaWxlX3RvcEA3CgpzdW1fbWFueV9pbnRzX2FmdGVyX3doaWxlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5MAogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMiAvLyAwCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTEKICAgIC8vIGZvciB2YWwgaW4gc2VsZi5tYW55X2ludHMudmFsdWU6CiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hbnlfaW50cyBleGlzdHMKICAgIGludGNfMiAvLyAwCiAgICBidXJ5IDIKCnN1bV9tYW55X2ludHNfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5MQogICAgLy8gZm9yIHZhbCBpbiBzZWxmLm1hbnlfaW50cy52YWx1ZToKICAgIGRpZyAxCiAgICBwdXNoaW50IDUxMyAvLyA1MTMKICAgIDwKICAgIGJ6IHN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTIKICAgIC8vIHRvdGFsID0gdG90YWwgKyB2YWwKICAgIGRpZyAyCiAgICArCiAgICBidXJ5IDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDIKICAgIGIgc3VtX21hbnlfaW50c19mb3JfaGVhZGVyQDIKCnN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnRlc3RfYm94X3JlZltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm94X3JlZjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIGluaXQgcmVmLCB3aXRoIHZhbGlkIGtleSB0eXBlcwogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PSJibG9iIikKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTk5CiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDctMjA4CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9jcmVhdGUKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxMS0yMTIKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjEzCiAgICAvLyBhcHBfYWRkcmVzcyA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYnl0ZXMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNQogICAgLy8gYm94X3JlZi5yZXBsYWNlKDAsIHNlbmRlcl9ieXRlcykKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE2CiAgICAvLyBib3hfcmVmLnJlc2l6ZSg4MDAwKQogICAgcHVzaGludCA4MDAwIC8vIDgwMDAKICAgIGJveF9yZXNpemUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE3CiAgICAvLyBib3hfcmVmLnNwbGljZSgwLCAwLCBhcHBfYWRkcmVzcykKICAgIGludGNfMiAvLyAwCiAgICBkdXAKICAgIGRpZyAzCiAgICBib3hfc3BsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxOAogICAgLy8gYm94X3JlZi5yZXBsYWNlKDY0LCB2YWx1ZV8zKQogICAgcHVzaGludCA2NCAvLyA2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNAogICAgLy8gdmFsdWVfMyA9IEJ5dGVzKGIiaGVsbG8iKQogICAgYnl0ZWMgMTIgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE4CiAgICAvLyBib3hfcmVmLnJlcGxhY2UoNjQsIHZhbHVlXzMpCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTkKICAgIC8vIHByZWZpeCA9IGJveF9yZWYuZXh0cmFjdCgwLCAzMiAqIDIgKyB2YWx1ZV8zLmxlbmd0aCkKICAgIGludGNfMiAvLyAwCiAgICBwdXNoaW50IDY5IC8vIDY5CiAgICBib3hfZXh0cmFjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyMAogICAgLy8gYXNzZXJ0IHByZWZpeCA9PSBhcHBfYWRkcmVzcyArIHNlbmRlcl9ieXRlcyArIHZhbHVlXzMKICAgIGRpZyAxCiAgICBkaWcgMwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE0CiAgICAvLyB2YWx1ZV8zID0gQnl0ZXMoYiJoZWxsbyIpCiAgICBieXRlYyAxMiAvLyAweDY4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBjb25jYXQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjIyLTIyMwogICAgLy8gIyBkZWxldGUKICAgIC8vIGRlbCBib3hfcmVmLnZhbHVlCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjI2LTIyNwogICAgLy8gIyBxdWVyeQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IGJveF9yZWYubWF5YmUoKQogICAgYm94X2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyOAogICAgLy8gYXNzZXJ0IG5vdCBleGlzdHMKICAgIGR1cAogICAgIQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjI5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYiIiCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzIDB4CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjMwCiAgICAvLyBhc3NlcnQgYm94X3JlZi5nZXQoZGVmYXVsdD1zZW5kZXJfYnl0ZXMpID09IHNlbmRlcl9ieXRlcwogICAgZGlnIDMKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzItMjMzCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi52YWx1ZSA9IHNlbmRlcl9ieXRlcyArIGFwcF9hZGRyZXNzCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjMyLTIzMwogICAgLy8gIyB1cGRhdGUKICAgIC8vIGJveF9yZWYudmFsdWUgPSBzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMi0yMzMKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnZhbHVlID0gc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjM0CiAgICAvLyBhc3NlcnQgYm94X3JlZiwgIkJsb2IgZXhpc3RzIgogICAgYm94X2xlbgogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjM1CiAgICAvLyBhc3NlcnQgYm94X3JlZi5sZW5ndGggPT0gNjQKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzgtMjM5CiAgICAvLyAjIGluc3RhbmNlIGJveCByZWYKICAgIC8vIHNlbGYuYm94X3JlZi5jcmVhdGUoc2l6ZT1VSW50NjQoMzIpKQogICAgYnl0ZWMgMTYgLy8gImJveF9yZWYiCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDEKICAgIC8vIGRlbCBzZWxmLmJveF9yZWYudmFsdWUKICAgIGJ5dGVjIDE2IC8vICJib3hfcmVmIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X25lc3RlZF9zdHJ1Y3Rbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfbmVzdGVkX3N0cnVjdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ2CiAgICAvLyBhc3NlcnQgc3RydWN0LmEsICJzdHJ1Y3QuYSBpcyB0cnV0aHkiCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGFzc2VydCAvLyBzdHJ1Y3QuYSBpcyB0cnV0aHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDcKICAgIC8vIHN0cnVjdF9ieXRlcyA9IFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ4CiAgICAvLyBzdHJ1Y3Rfc2l6ZSA9IHN0cnVjdF9ieXRlcy5sZW5ndGgKICAgIGR1cAogICAgbGVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ5CiAgICAvLyB0YWlsX29mZnNldCA9IFVJbnQ2NCg0MDk2ICsgMikKICAgIGludGMgNSAvLyA0MDk4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjUwLTI1MQogICAgLy8gIyBpbml0aWFsaXplIGJveCB0byB6ZXJvCiAgICAvLyBib3guY3JlYXRlKHNpemU9dGFpbF9vZmZzZXQgKyBzdHJ1Y3Rfc2l6ZSkKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDUKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1MC0yNTEKICAgIC8vICMgaW5pdGlhbGl6ZSBib3ggdG8gemVybwogICAgLy8gYm94LmNyZWF0ZShzaXplPXRhaWxfb2Zmc2V0ICsgc3RydWN0X3NpemUpCiAgICBzd2FwCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDUKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1Mi0yNTMKICAgIC8vICMgc2V0IGNvcnJlY3Qgb2Zmc2V0IGZvciBkeW5hbWljIHBvcnRpb24KICAgIC8vIGJveC5yZXBsYWNlKHRhaWxfb2Zmc2V0IC0gMiwgYXJjNC5VSW50MTYodGFpbF9vZmZzZXQpLmJ5dGVzKQogICAgaW50YyA0IC8vIDQwOTYKICAgIHB1c2hieXRlcyAweDEwMDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDkKICAgIC8vIHRhaWxfb2Zmc2V0ID0gVUludDY0KDQwOTYgKyAyKQogICAgaW50YyA1IC8vIDQwOTgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTQtMjU1CiAgICAvLyAjIHNldCBkeW5hbWljIGRhdGEKICAgIC8vIGJveC5yZXBsYWNlKHRhaWxfb2Zmc2V0LCBzdHJ1Y3RfYnl0ZXMpCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5uZXN0ZWRfd3JpdGVbcm91dGluZ10oKSAtPiB2b2lkOgpuZXN0ZWRfd3JpdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjAKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuYSA9IHZhbHVlCiAgICBpbnRjIDUgLy8gNDA5OAogICAgdW5jb3ZlciAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5iID0gdmFsdWUgKyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjEKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuYiA9IHZhbHVlICsgMQogICAgcHVzaGludCA0MTEwIC8vIDQxMTAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBwdXNoaW50IDQxMzYgLy8gNDEzNgogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICBkaWcgMwogICAgKgogICAgaW50YyA2IC8vIDQxMzgKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNiAvLyA0MTM4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNQogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYzCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmMgPSB2YWx1ZSArIDMKICAgIGRpZyAyCiAgICBwdXNoaW50IDMgLy8gMwogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYzCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmMgPSB2YWx1ZSArIDMKICAgIHB1c2hpbnQgNDExOCAvLyA0MTE4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY0CiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmQgPSB2YWx1ZSArIDQKICAgIGRpZyAyCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY0CiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmQgPSB2YWx1ZSArIDQKICAgIHB1c2hpbnQgNDEyOCAvLyA0MTI4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgcHVzaGludCA0MTA4IC8vIDQxMDgKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA1IC8vIDQwOTgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGR1cAogICAgZGlnIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgcHVzaGludCAxOCAvLyAxOAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciA0CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3JlYWRbcm91dGluZ10oKSAtPiB2b2lkOgpuZXN0ZWRfcmVhZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzAKICAgIC8vIGEgPSBib3gudmFsdWUubmVzdGVkLmEKICAgIGludGMgNSAvLyA0MDk4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MQogICAgLy8gYiA9IGJveC52YWx1ZS5uZXN0ZWQuYgogICAgcHVzaGludCA0MTEwIC8vIDQxMTAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjcyCiAgICAvLyBhcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2kxXVtpMl0KICAgIHB1c2hpbnQgNDEzNiAvLyA0MTM2CiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgIGRpZyA1CiAgICAqCiAgICBpbnRjIDYgLy8gNDEzOAogICAgZGlnIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNiAvLyA0MTM4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzIKICAgIC8vIGFycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLmlubmVyLmFycl9hcnJbaTFdW2kyXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDYKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDUKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzIKICAgIC8vIGFycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLmlubmVyLmFycl9hcnJbaTFdW2kyXQogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzMKICAgIC8vIGMgPSBib3gudmFsdWUubmVzdGVkLmlubmVyLmMKICAgIHB1c2hpbnQgNDExOCAvLyA0MTE4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZCA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZAogICAgcHVzaGludCA0MTI4IC8vIDQxMjgKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgcHVzaGludCA0MTA4IC8vIDQxMDgKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA1IC8vIDQwOTgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NQogICAgLy8gd29haF9hcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC53b2FoW2kxXS5hcnJfYXJyW2kyXVtpM10KICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHVuY292ZXIgMTAKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZHVwCiAgICB1bmNvdmVyIDUKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NQogICAgLy8gd29haF9hcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC53b2FoW2kxXS5hcnJfYXJyW2kyXVtpM10KICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgcHVzaGludCAxOCAvLyAxOAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDgKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgOAogICAgKgogICAgZGlnIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NQogICAgLy8gd29haF9hcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC53b2FoW2kxXS5hcnJfYXJyW2kyXVtpM10KICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDcKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgdW5jb3ZlciA2CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc3CiAgICAvLyByZXR1cm4gYSArIGIgKyBhcnJfYXJyICsgYyArIGQgKyB3b2FoX2Fycl9hcnIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA1CiAgICArCiAgICB1bmNvdmVyIDQKICAgICsKICAgIHVuY292ZXIgMwogICAgKwogICAgdW5jb3ZlciAyCiAgICArCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBpbnRjXzIgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg1CiAgICAvLyBzZWxmLnRvb19tYW55X2Jvb2xzLnZhbHVlW2luZGV4XSA9IHZhbHVlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICUKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBieXRlYyA4IC8vICJ0b29fbWFueV9ib29scyIKICAgIGNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc3VtX2Jvb2xzW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX2Jvb2xzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODkKICAgIC8vIHRvdGFsID0gVUludDY0KCkKICAgIGludGNfMiAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkwCiAgICAvLyBmb3IgdmFsdWUgaW4gc2VsZi50b29fbWFueV9ib29scy52YWx1ZToKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b29fbWFueV9ib29scyBleGlzdHMKICAgIGludGNfMiAvLyAwCgpzdW1fYm9vbHNfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5MAogICAgLy8gZm9yIHZhbHVlIGluIHNlbGYudG9vX21hbnlfYm9vbHMudmFsdWU6CiAgICBkdXAKICAgIHB1c2hpbnQgMzMwMDAgLy8gMzMwMDAKICAgIDwKICAgIGJ6IHN1bV9ib29sc19hZnRlcl9mb3JAOQogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICUKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIHN3YXAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5MQogICAgLy8gaWYgdmFsdWU6CiAgICBieiBzdW1fYm9vbHNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkyCiAgICAvLyB0b3RhbCArPSAxCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMgoKc3VtX2Jvb2xzX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTMKICAgIC8vIGlmIHRvdGFsID09IHN0b3BfYXRfdG90YWw6CiAgICBkaWcgMQogICAgZGlnIDMKICAgID09CiAgICBibnogc3VtX2Jvb2xzX2FmdGVyX2ZvckA5CiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgc3VtX2Jvb2xzX2Zvcl9oZWFkZXJAMgoKc3VtX2Jvb2xzX2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveF9tYXBfdGVzdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfdGVzdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTkKICAgIC8vIGtleV8wID0gVUludDY0KDApCiAgICBpbnRjXzIgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMwMgogICAgLy8gc2VsZi5ib3hfbWFwW2tleV8wXSA9IHZhbHVlCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAxCiAgICAvLyB2YWx1ZSA9IFN0cmluZygiSG1tbW1tIikKICAgIHB1c2hieXRlcyAiSG1tbW1tIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMwMgogICAgLy8gc2VsZi5ib3hfbWFwW2tleV8wXSA9IHZhbHVlCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzA1CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwW2tleV8wXS5ieXRlcy5sZW5ndGggPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBib3hfbGVuCiAgICBwb3AKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAwCiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXAuZ2V0KGtleV8xLCBkZWZhdWx0PVN0cmluZygiZGVmYXVsdCIpKSA9PSBTdHJpbmcoImRlZmF1bHQiKQogICAgaXRvYgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBieXRlYyAxNyAvLyAiZGVmYXVsdCIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgMTcgLy8gImRlZmF1bHQiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzEwCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gc2VsZi5ib3hfbWFwLm1heWJlKGtleV8xKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTEKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTcKICAgIC8vIHRtcF9ib3hfbWFwW2tleV8xXSA9IFN0cmluZygiaGVsbG8iKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGR1cAogICAgYnl0ZWMgMTIgLy8gImhlbGxvIgogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMxOQogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9zZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjMKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNwogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBpdG9iCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfbWFwIGVudHJ5IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfZGVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMxCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGl0b2IKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveF9tYXBfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF9leGlzdHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzUKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBpdG9iCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDIgMCA4IDQwOTYgNDA5OCA0MTM4CiAgICBieXRlY2Jsb2NrICJib3giIDB4NDI0ZjU4NWY0MyAiYmxvYiIgImJveF9sYXJnZSIgMHgxNTFmN2M3NSAiYm94X2EiICJib3hfZCIgImIiICJ0b29fbWFueV9ib29scyIgIm1hbnlfaW50cyIgIjAiIDB4MDAwMjM0MzIgMHg2ODY1NmM2YzZmIDB4NmY2MzYxIDB4NzQ3ODZlIDB4MDY4MTAxICJib3hfcmVmIiAiZGVmYXVsdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo1OQogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGYyNmM2ZDQyIDB4ZWYxODZjZjcgMHg3ZDM3Mjk2ZSAweGYxM2RkOTM3IDB4MzMzMjVkM2QgMHhhNjE3NDgxMiAweGZhYmNiODg1IDB4ZDU2NmM2MzIgMHgwNGVmNDk3MSAweDIzZWNiMzJjIDB4MDE5OTQwOGQgMHg3NzIwNTljYSAweDAxMjYzZGY2IDB4ZWVmNzU4MTYgMHg5OTY0OTdhZSAweDZjZWM3MmZmIDB4NmY5ZDEwNzUgMHg1OWVmMzc2MCAweGFhNjY2Yjk2IDB4ZGZiZGQ2MzYgMHhiNTMyOTEzYSAweGMyOWYxNjY5IDB4OWM4ODhjMDkgMHhlNmY2ODUwNiAweDhlZTJjMzY0IC8vIG1ldGhvZCAic3RvcmVfZW51bXMoKXZvaWQiLCBtZXRob2QgInJlYWRfZW51bXMoKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAic2V0X2JveGVzKHVpbnQ2NCxieXRlW10sc3RyaW5nKXZvaWQiLCBtZXRob2QgImJveGVzX2V4aXN0KCkoYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgImNoZWNrX2tleXMoKXZvaWQiLCBtZXRob2QgInJlYWRfYm94ZXMoKSh1aW50NjQsYnl0ZVtdLHN0cmluZyx1aW50NjQpIiwgbWV0aG9kICJpbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlKCl2b2lkIiwgbWV0aG9kICJkZWxldGVfYm94ZXMoKXZvaWQiLCBtZXRob2QgInNsaWNlX2JveCgpdm9pZCIsIG1ldGhvZCAiYXJjNF9ib3goKXZvaWQiLCBtZXRob2QgImNyZWF0ZV9tYW55X2ludHMoKXZvaWQiLCBtZXRob2QgInNldF9tYW55X2ludHModWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzdW1fbWFueV9pbnRzKCl1aW50NjQiLCBtZXRob2QgInRlc3RfYm94X3JlZigpdm9pZCIsIG1ldGhvZCAic2V0X25lc3RlZF9zdHJ1Y3QoKHVpbnQ2NCwodWludDY0LHVpbnQ2NFtdW10sdWludDY0KSwodWludDY0LHVpbnQ2NFtdW10sdWludDY0KVtdLHVpbnQ2NCkpdm9pZCIsIG1ldGhvZCAibmVzdGVkX3dyaXRlKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAibmVzdGVkX3JlYWQodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJjcmVhdGVfYm9vbHMoKXZvaWQiLCBtZXRob2QgInNldF9ib29sKHVpbnQ2NCxib29sKXZvaWQiLCBtZXRob2QgInN1bV9ib29scyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJib3hfbWFwX3Rlc3QoKXZvaWQiLCBtZXRob2QgImJveF9tYXBfc2V0KHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiYm94X21hcF9nZXQodWludDY0KXN0cmluZyIsIG1ldGhvZCAiYm94X21hcF9kZWwodWludDY0KXZvaWQiLCBtZXRob2QgImJveF9tYXBfZXhpc3RzKHVpbnQ2NClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc3RvcmVfZW51bXMgcmVhZF9lbnVtcyBzZXRfYm94ZXMgYm94ZXNfZXhpc3QgbWFpbl9jaGVja19rZXlzX3JvdXRlQDEwIHJlYWRfYm94ZXMgaW5kaXJlY3RfZXh0cmFjdF9hbmRfcmVwbGFjZSBkZWxldGVfYm94ZXMgc2xpY2VfYm94IG1haW5fYXJjNF9ib3hfcm91dGVAMTUgbWFpbl9jcmVhdGVfbWFueV9pbnRzX3JvdXRlQDE2IHNldF9tYW55X2ludHMgc3VtX21hbnlfaW50cyB0ZXN0X2JveF9yZWYgc2V0X25lc3RlZF9zdHJ1Y3QgbmVzdGVkX3dyaXRlIG5lc3RlZF9yZWFkIG1haW5fY3JlYXRlX2Jvb2xzX3JvdXRlQDIzIHNldF9ib29sIHN1bV9ib29scyBib3hfbWFwX3Rlc3QgYm94X21hcF9zZXQgYm94X21hcF9nZXQgYm94X21hcF9kZWwgYm94X21hcF9leGlzdHMKICAgIGVycgoKbWFpbl9jcmVhdGVfYm9vbHNfcm91dGVAMjM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgxCiAgICAvLyBzZWxmLnRvb19tYW55X2Jvb2xzLmNyZWF0ZSgpCiAgICBieXRlYyA4IC8vICJ0b29fbWFueV9ib29scyIKICAgIHB1c2hpbnQgNDEyNSAvLyA0MTI1CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfbWFueV9pbnRzX3JvdXRlQDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4MQogICAgLy8gc2VsZi5tYW55X2ludHMuY3JlYXRlKCkKICAgIGJ5dGVjIDkgLy8gIm1hbnlfaW50cyIKICAgIHB1c2hpbnQgNDEwNCAvLyA0MTA0CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzRfYm94X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzcyAweDY0IDB4MDAwMTAyMDMgLy8gMHg2NCwgMHgwMDAxMDIwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MgogICAgLy8gYm94X2QudmFsdWUgPSBTdGF0aWNJbnRzKGFyYzQuVUludDgoMCksIGFyYzQuVUludDgoMSksIGFyYzQuVUludDgoMiksIGFyYzQuVUludDgoMykpCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hlY2tfa2V5c19yb3V0ZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzNDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnN0b3JlX2VudW1zW3JvdXRpbmddKCkgLT4gdm9pZDoKc3RvcmVfZW51bXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6NzUKICAgIC8vIHNlbGYub2NhLnZhbHVlID0gT25Db21wbGV0ZUFjdGlvbi5PcHRJbgogICAgaW50Y18wIC8vIE9wdEluCiAgICBpdG9iCiAgICBieXRlYyAxMyAvLyAib2NhIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBzZWxmLnR4bi52YWx1ZSA9IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdG9iCiAgICBieXRlYyAxNCAvLyAidHhuIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5yZWFkX2VudW1zW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVhZF9lbnVtczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4MAogICAgLy8gYXNzZXJ0IG9wLkJveC5nZXQoYiJvY2EiKVswXSA9PSBvcC5pdG9iKHNlbGYub2NhLnZhbHVlKQogICAgYnl0ZWMgMTMgLy8gMHg2ZjYzNjEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9jYSBleGlzdHMKICAgIGR1cAogICAgYnRvaQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IG9wLkJveC5nZXQoYiJ0eG4iKVswXSA9PSBvcC5pdG9iKHNlbGYudHhuLnZhbHVlKQogICAgYnl0ZWMgMTQgLy8gMHg3NDc4NmUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR4biBleGlzdHMKICAgIGR1cAogICAgYnRvaQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4MwogICAgLy8gcmV0dXJuIGFyYzQuVHVwbGUoKGFyYzQuVUludDY0KHNlbGYub2NhLnZhbHVlKSwgYXJjNC5VSW50NjQoc2VsZi50eG4udmFsdWUpKSkKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfYm94ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLmJveF9hLnZhbHVlID0gYQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4OAogICAgLy8gc2VsZi5ib3hfYi52YWx1ZSA9IGIuY29weSgpCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA3IC8vICJiIgogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4OQogICAgLy8gc2VsZi5ib3hfYy52YWx1ZSA9IGMKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjkwCiAgICAvLyBzZWxmLmJveF9kLnZhbHVlID0gYi5uYXRpdmUKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MQogICAgLy8gc2VsZi5ib3hfbGFyZ2UuY3JlYXRlKCkKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIHB1c2hpbnQgNjE2MCAvLyA2MTYwCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MgogICAgLy8gc2VsZi5ib3hfbGFyZ2UudmFsdWUuZSA9IFVJbnQ2NCg0MikKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGludGMgNCAvLyA0MDk2CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTMKICAgIC8vIHNlbGYuYm94X2xhcmdlLnJlcGxhY2Uoc2l6ZV9vZihCeXRlczEwMjQpICogNCwgYXJjNC5VSW50NjQoNDIpLmJ5dGVzKQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgaW50YyA0IC8vIDQwOTYKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMmEKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTgKICAgIC8vIHNlbGYuYm94X2EudmFsdWUgKz0gMwogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYSBleGlzdHMKICAgIGJ0b2kKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IubGVuZ3RoID09IGIuYnl0ZXMubGVuZ3RoCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGR1cDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICBkdXAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTA2LTEwNwogICAgLy8gIyB0ZXN0IC52YWx1ZS5ieXRlcwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMF0gPT0gYy5ieXRlc1swXQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMiAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyA2CiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBkaWcgMwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZGlnIDcKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBleHRyYWN0MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbOi0xXSA9PSBjLmJ5dGVzWzotMV0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgPAogICAgZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGludGNfMSAvLyAyCiAgICBkaWcgNAogICAgPAogICAgdW5jb3ZlciA0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgNQogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vICMgdGVzdCAudmFsdWUgd2l0aCBCeXRlcyB0eXBlCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVswXSA9PSBiLm5hdGl2ZVswXQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICB1bmNvdmVyIDQKICAgIGV4dHJhY3QgMiAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVstMV0gPT0gYi5uYXRpdmVbLTFdCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGRpZyA0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgZXh0cmFjdDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMTUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzotMV0gPT0gYi5uYXRpdmVbOi0xXQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMgogICAgc3dhcAogICAgLQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgIHN3YXAKICAgIC0KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6NV0gPT0gYi5uYXRpdmVbOjVdCiAgICBwdXNoaW50IDUgLy8gNQogICAgZGlnIDIKICAgIDwKICAgIGRpZyAyCiAgICBwdXNoaW50IDUgLy8gNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIHB1c2hpbnQgNSAvLyA1CiAgICBkaWcgMgogICAgPj0KICAgIHB1c2hpbnQgNSAvLyA1CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6IFVJbnQ2NCgyKV0gPT0gYi5uYXRpdmVbOiBVSW50NjQoMildCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDIKICAgID49CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE5CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbGFyZ2UubGVuZ3RoID09IHNpemVfb2YoTGFyZ2VTdHJ1Y3QpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIHB1c2hpbnQgNjE2MCAvLyA2MTYwCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hlc19leGlzdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveGVzX2V4aXN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEyMwogICAgLy8gcmV0dXJuIGJvb2woc2VsZi5ib3hfYSksIGJvb2woc2VsZi5ib3hfYiksIGJvb2woc2VsZi5ib3hfYyksIGJvb2woc2VsZi5ib3hfbGFyZ2UpCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9sZW4KICAgIGNvdmVyIDIKICAgIHBvcAogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9sZW4KICAgIGNvdmVyIDMKICAgIHBvcAogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgYm94X2xlbgogICAgY292ZXIgNAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBwdXNoaW50IDMgLy8gMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9ib3hlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM1CiAgICAvLyBnZXRfYm94X3ZhbHVlX3BsdXNfMShzZWxmLmJveF9hKSAtIDEsCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozNDUKICAgIC8vIHJldHVybiBib3gudmFsdWUgKyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzUKICAgIC8vIGdldF9ib3hfdmFsdWVfcGx1c18xKHNlbGYuYm94X2EpIC0gMSwKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM2CiAgICAvLyBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM3CiAgICAvLyBzZWxmLmJveF9jLnZhbHVlLAogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9jIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzOAogICAgLy8gc2VsZi5ib3hfbGFyZ2UudmFsdWUuZSwKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGludGMgNCAvLyA0MDk2CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMTQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAyMCAvLyAyMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgppbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MwogICAgLy8gbGFyZ2UgPSBzZWxmLmJveF9sYXJnZS52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBsYXJnZSA9IHNlbGYuYm94X2xhcmdlLnZhbHVlLmNvcHkoKQogICAgLy8gbGFyZ2UuZSArPSAxCiAgICBpbnRjIDQgLy8gNDA5NgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ0CiAgICAvLyBsYXJnZS5lICs9IDEKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZSA9IGxhcmdlLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0My0xNDUKICAgIC8vIGxhcmdlID0gc2VsZi5ib3hfbGFyZ2UudmFsdWUuY29weSgpCiAgICAvLyBsYXJnZS5lICs9IDEKICAgIC8vIHNlbGYuYm94X2xhcmdlLnZhbHVlID0gbGFyZ2UuY29weSgpCiAgICBpbnRjIDQgLy8gNDA5NgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0OQogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUwCiAgICAvLyBkZWwgc2VsZi5ib3hfYi52YWx1ZQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1MQogICAgLy8gZGVsIHNlbGYuYm94X2MudmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGRpZyAxCiAgICBkaWcgMwogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi5nZXQoZGVmYXVsdD1hcmM0LkR5bmFtaWNCeXRlcyhiIjQyIikpLm5hdGl2ZSA9PSBiIjQyIgogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9nZXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMjM0MzIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLmdldChkZWZhdWx0PWFyYzQuU3RyaW5nKCI0MiIpKSA9PSAiNDIiCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2dldAogICAgYnl0ZWMgMTEgLy8gMHgwMDAyMzQzMgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMSAvLyAweDAwMDIzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTU2CiAgICAvLyBhc3NlcnQgbm90IGFfZXhpc3RzCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhID09IDAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1OAogICAgLy8gZGVsIHNlbGYuYm94X2xhcmdlLnZhbHVlCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zbGljZV9ib3hbcm91dGluZ10oKSAtPiB2b2lkOgpzbGljZV9ib3g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYzCiAgICAvLyBib3hfMC52YWx1ZSA9IEJ5dGVzKGIiVGVzdGluZyB0ZXN0aW5nIDEyMyIpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjMKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY0CiAgICAvLyBhc3NlcnQgYm94XzAudmFsdWVbMDo3XSA9PSBiIlRlc3RpbmciCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGRpZyAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgNyAvLyA3CiAgICBkaWcgMgogICAgPAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcgLy8gNwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxCiAgICAtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY0CiAgICAvLyBhc3NlcnQgYm94XzAudmFsdWVbMDo3XSA9PSBiIlRlc3RpbmciCiAgICBjb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgcHVzaGJ5dGVzIDB4NTQ2NTczNzQ2OTZlNjcKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjYKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIHB1c2hieXRlcyAweDAwMDU0ODY1NmM2YzZmCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY3CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1syOjEwXSA9PSBiIkhlbGxvIgogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9sZW4KICAgIHBvcAogICAgaW50Y18xIC8vIDIKICAgIGRpZyAxCiAgICA8CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBkaWcgMgogICAgPAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBjb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgcHVzaGJ5dGVzIDB4NDg2NTZjNmM2ZgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9tYW55X2ludHNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfbWFueV9pbnRzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxODUKICAgIC8vIHNlbGYubWFueV9pbnRzLnZhbHVlW2luZGV4XSA9IHZhbHVlCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc3VtX21hbnlfaW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN1bV9tYW55X2ludHM6CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAoKc3VtX21hbnlfaW50c193aGlsZV90b3BANzoKICAgIHB1c2hpbnQgMTA1MTAgLy8gMTA1MTAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IHN1bV9tYW55X2ludHNfYWZ0ZXJfd2hpbGVAMTIKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAxNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDE1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIHN1bV9tYW55X2ludHNfd2hpbGVfdG9wQDcKCnN1bV9tYW55X2ludHNfYWZ0ZXJfd2hpbGVAMTI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTkwCiAgICAvLyB0b3RhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5MQogICAgLy8gZm9yIHZhbCBpbiBzZWxmLm1hbnlfaW50cy52YWx1ZToKICAgIGJ5dGVjIDkgLy8gIm1hbnlfaW50cyIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFueV9pbnRzIGV4aXN0cwogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgMgoKc3VtX21hbnlfaW50c19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTkxCiAgICAvLyBmb3IgdmFsIGluIHNlbGYubWFueV9pbnRzLnZhbHVlOgogICAgZGlnIDEKICAgIHB1c2hpbnQgNTEzIC8vIDUxMwogICAgPAogICAgYnogc3VtX21hbnlfaW50c19hZnRlcl9mb3JANQogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGJ5dGVjIDkgLy8gIm1hbnlfaW50cyIKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5MgogICAgLy8gdG90YWwgPSB0b3RhbCArIHZhbAogICAgZGlnIDIKICAgICsKICAgIGJ1cnkgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMgogICAgYiBzdW1fbWFueV9pbnRzX2Zvcl9oZWFkZXJAMgoKc3VtX21hbnlfaW50c19hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QudGVzdF9ib3hfcmVmW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9ib3hfcmVmOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5Ny0xOTgKICAgIC8vICMgaW5pdCByZWYsIHdpdGggdmFsaWQga2V5IHR5cGVzCiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9ImJsb2IiKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTkKICAgIC8vIGFzc2VydCBub3QgYm94X3JlZiwgIm5vIGRhdGEiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBubyBkYXRhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNy0yMDgKICAgIC8vICMgY3JlYXRlCiAgICAvLyBhc3NlcnQgYm94X3JlZi5jcmVhdGUoc2l6ZT1VSW50NjQoMzIpKQogICAgcHVzaGludCAzMiAvLyAzMgogICAgYm94X2NyZWF0ZQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjExLTIxMgogICAgLy8gIyBtYW5pcHVsYXRlIGRhdGEKICAgIC8vIHNlbmRlcl9ieXRlcyA9IFR4bi5zZW5kZXIuYnl0ZXMKICAgIHR4biBTZW5kZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTMKICAgIC8vIGFwcF9hZGRyZXNzID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5ieXRlcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE1CiAgICAvLyBib3hfcmVmLnJlcGxhY2UoMCwgc2VuZGVyX2J5dGVzKQogICAgaW50Y18yIC8vIDAKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTYKICAgIC8vIGJveF9yZWYucmVzaXplKDgwMDApCiAgICBwdXNoaW50IDgwMDAgLy8gODAwMAogICAgYm94X3Jlc2l6ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTcKICAgIC8vIGJveF9yZWYuc3BsaWNlKDAsIDAsIGFwcF9hZGRyZXNzKQogICAgaW50Y18yIC8vIDAKICAgIGR1cAogICAgZGlnIDMKICAgIGJveF9zcGxpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE4CiAgICAvLyBib3hfcmVmLnJlcGxhY2UoNjQsIHZhbHVlXzMpCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE0CiAgICAvLyB2YWx1ZV8zID0gQnl0ZXMoYiJoZWxsbyIpCiAgICBieXRlYyAxMiAvLyAweDY4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTgKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxOQogICAgLy8gcHJlZml4ID0gYm94X3JlZi5leHRyYWN0KDAsIDMyICogMiArIHZhbHVlXzMubGVuZ3RoKQogICAgaW50Y18yIC8vIDAKICAgIHB1c2hpbnQgNjkgLy8gNjkKICAgIGJveF9leHRyYWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjIwCiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgZGlnIDEKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTQKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDEyIC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyMAogICAgLy8gYXNzZXJ0IHByZWZpeCA9PSBhcHBfYWRkcmVzcyArIHNlbmRlcl9ieXRlcyArIHZhbHVlXzMKICAgIGNvbmNhdAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjItMjIzCiAgICAvLyAjIGRlbGV0ZQogICAgLy8gZGVsIGJveF9yZWYudmFsdWUKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjYtMjI3CiAgICAvLyAjIHF1ZXJ5CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gYm94X3JlZi5tYXliZSgpCiAgICBib3hfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjI4CiAgICAvLyBhc3NlcnQgbm90IGV4aXN0cwogICAgZHVwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBiIiIKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgMHgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzAKICAgIC8vIGFzc2VydCBib3hfcmVmLmdldChkZWZhdWx0PXNlbmRlcl9ieXRlcykgPT0gc2VuZGVyX2J5dGVzCiAgICBkaWcgMwogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMi0yMzMKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnZhbHVlID0gc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzItMjMzCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi52YWx1ZSA9IHNlbmRlcl9ieXRlcyArIGFwcF9hZGRyZXNzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjMyLTIzMwogICAgLy8gIyB1cGRhdGUKICAgIC8vIGJveF9yZWYudmFsdWUgPSBzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzQKICAgIC8vIGFzc2VydCBib3hfcmVmLCAiQmxvYiBleGlzdHMiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzUKICAgIC8vIGFzc2VydCBib3hfcmVmLmxlbmd0aCA9PSA2NAogICAgcHVzaGludCA2NCAvLyA2NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzOC0yMzkKICAgIC8vICMgaW5zdGFuY2UgYm94IHJlZgogICAgLy8gc2VsZi5ib3hfcmVmLmNyZWF0ZShzaXplPVVJbnQ2NCgzMikpCiAgICBieXRlYyAxNiAvLyAiYm94X3JlZiIKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0MQogICAgLy8gZGVsIHNlbGYuYm94X3JlZi52YWx1ZQogICAgYnl0ZWMgMTYgLy8gImJveF9yZWYiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfbmVzdGVkX3N0cnVjdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9uZXN0ZWRfc3RydWN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDYKICAgIC8vIGFzc2VydCBzdHJ1Y3QuYSwgInN0cnVjdC5hIGlzIHRydXRoeSIKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYXNzZXJ0IC8vIHN0cnVjdC5hIGlzIHRydXRoeQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NwogICAgLy8gc3RydWN0X2J5dGVzID0gVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDgKICAgIC8vIHN0cnVjdF9zaXplID0gc3RydWN0X2J5dGVzLmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDkKICAgIC8vIHRhaWxfb2Zmc2V0ID0gVUludDY0KDQwOTYgKyAyKQogICAgaW50YyA1IC8vIDQwOTgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTAtMjUxCiAgICAvLyAjIGluaXRpYWxpemUgYm94IHRvIHplcm8KICAgIC8vIGJveC5jcmVhdGUoc2l6ZT10YWlsX29mZnNldCArIHN0cnVjdF9zaXplKQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjUwLTI1MQogICAgLy8gIyBpbml0aWFsaXplIGJveCB0byB6ZXJvCiAgICAvLyBib3guY3JlYXRlKHNpemU9dGFpbF9vZmZzZXQgKyBzdHJ1Y3Rfc2l6ZSkKICAgIHN3YXAKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjUyLTI1MwogICAgLy8gIyBzZXQgY29ycmVjdCBvZmZzZXQgZm9yIGR5bmFtaWMgcG9ydGlvbgogICAgLy8gYm94LnJlcGxhY2UodGFpbF9vZmZzZXQgLSAyLCBhcmM0LlVJbnQxNih0YWlsX29mZnNldCkuYnl0ZXMpCiAgICBpbnRjIDQgLy8gNDA5NgogICAgcHVzaGJ5dGVzIDB4MTAwMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDUKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGFpbF9vZmZzZXQgPSBVSW50NjQoNDA5NiArIDIpCiAgICBpbnRjIDUgLy8gNDA5OAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NC0yNTUKICAgIC8vICMgc2V0IGR5bmFtaWMgZGF0YQogICAgLy8gYm94LnJlcGxhY2UodGFpbF9vZmZzZXQsIHN0cnVjdF9ieXRlcykKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0Lm5lc3RlZF93cml0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6Cm5lc3RlZF93cml0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MAogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5hID0gdmFsdWUKICAgIGludGMgNSAvLyA0MDk4CiAgICB1bmNvdmVyIDMKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYxCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmIgPSB2YWx1ZSArIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5iID0gdmFsdWUgKyAxCiAgICBwdXNoaW50IDQxMTAgLy8gNDExMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIHB1c2hpbnQgNDEzNiAvLyA0MTM2CiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAzCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgIGRpZyAzCiAgICAqCiAgICBpbnRjIDYgLy8gNDEzOAogICAgZGlnIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA2IC8vIDQxMzgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyA0CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjMKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYyA9IHZhbHVlICsgMwogICAgZGlnIDIKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjMKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYyA9IHZhbHVlICsgMwogICAgcHVzaGludCA0MTE4IC8vIDQxMTgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjQKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZCA9IHZhbHVlICsgNAogICAgZGlnIDIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjQKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZCA9IHZhbHVlICsgNAogICAgcHVzaGludCA0MTI4IC8vIDQxMjgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNSAvLyA1CiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBwdXNoaW50IDQxMDggLy8gNDEwOAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjIDUgLy8gNDA5OAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZHVwCiAgICBkaWcgNAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNQogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkdXAKICAgIHVuY292ZXIgNAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICB1bmNvdmVyIDQKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5uZXN0ZWRfcmVhZFtyb3V0aW5nXSgpIC0+IHZvaWQ6Cm5lc3RlZF9yZWFkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MAogICAgLy8gYSA9IGJveC52YWx1ZS5uZXN0ZWQuYQogICAgaW50YyA1IC8vIDQwOTgKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjcxCiAgICAvLyBiID0gYm94LnZhbHVlLm5lc3RlZC5iCiAgICBwdXNoaW50IDQxMTAgLy8gNDExMAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzIKICAgIC8vIGFycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLmlubmVyLmFycl9hcnJbaTFdW2kyXQogICAgcHVzaGludCA0MTM2IC8vIDQxMzYKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDUKICAgICoKICAgIGludGMgNiAvLyA0MTM4CiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjcyCiAgICAvLyBhcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2kxXVtpMl0KICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA2IC8vIDQxMzgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNgogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNQogICAgaW50Y18zIC8vIDgKICAgICoKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MwogICAgLy8gYyA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYwogICAgcHVzaGludCA0MTE4IC8vIDQxMTgKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc0CiAgICAvLyBkID0gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5kCiAgICBwdXNoaW50IDQxMjggLy8gNDEyOAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBwdXNoaW50IDQxMDggLy8gNDEwOAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjIDUgLy8gNDA5OAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciAxMAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkdXAKICAgIHVuY292ZXIgNQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgOAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciA4CiAgICAqCiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICB1bmNvdmVyIDYKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzcKICAgIC8vIHJldHVybiBhICsgYiArIGFycl9hcnIgKyBjICsgZCArIHdvYWhfYXJyX2FycgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDUKICAgICsKICAgIHVuY292ZXIgNAogICAgKwogICAgdW5jb3ZlciAzCiAgICArCiAgICB1bmNvdmVyIDIKICAgICsKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGludGNfMiAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODUKICAgIC8vIHNlbGYudG9vX21hbnlfYm9vbHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fYm9vbHNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYm9vbHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4OQogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18yIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTAKICAgIC8vIGZvciB2YWx1ZSBpbiBzZWxmLnRvb19tYW55X2Jvb2xzLnZhbHVlOgogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvb19tYW55X2Jvb2xzIGV4aXN0cwogICAgaW50Y18yIC8vIDAKCnN1bV9ib29sc19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkwCiAgICAvLyBmb3IgdmFsdWUgaW4gc2VsZi50b29fbWFueV9ib29scy52YWx1ZToKICAgIGR1cAogICAgcHVzaGludCAzMzAwMCAvLyAzMzAwMAogICAgPAogICAgYnogc3VtX2Jvb2xzX2FmdGVyX2ZvckA5CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkxCiAgICAvLyBpZiB2YWx1ZToKICAgIGJ6IHN1bV9ib29sc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTIKICAgIC8vIHRvdGFsICs9IDEKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAyCgpzdW1fYm9vbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5MwogICAgLy8gaWYgdG90YWwgPT0gc3RvcF9hdF90b3RhbDoKICAgIGRpZyAxCiAgICBkaWcgMwogICAgPT0KICAgIGJueiBzdW1fYm9vbHNfYWZ0ZXJfZm9yQDkKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fYm9vbHNfZm9yX2hlYWRlckAyCgpzdW1fYm9vbHNfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF90ZXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF90ZXN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5OQogICAgLy8ga2V5XzAgPSBVSW50NjQoMCkKICAgIGludGNfMiAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDEKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXBba2V5XzBdLmJ5dGVzLmxlbmd0aCA9PSB2YWx1ZS5ieXRlcy5sZW5ndGgKICAgIGJveF9sZW4KICAgIHBvcAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDAKICAgIC8vIGtleV8xID0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMwOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X21hcC5nZXQoa2V5XzEsIGRlZmF1bHQ9U3RyaW5nKCJkZWZhdWx0IikpID09IFN0cmluZygiZGVmYXVsdCIpCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGJ5dGVjIDE3IC8vICJkZWZhdWx0IgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxNyAvLyAiZGVmYXVsdCIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTAKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBzZWxmLmJveF9tYXAubWF5YmUoa2V5XzEpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMxMQogICAgLy8gYXNzZXJ0IG5vdCBleGlzdHMKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMxNwogICAgLy8gdG1wX2JveF9tYXBba2V5XzFdID0gU3RyaW5nKCJoZWxsbyIpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICBieXRlYyAxMiAvLyAiaGVsbG8iCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzE5CiAgICAvLyBkZWwgdG1wX2JveF9tYXBba2V5XzFdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfc2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyMwogICAgLy8gc2VsZi5ib3hfbWFwW2tleV0gPSB2YWx1ZQogICAgc3dhcAogICAgaXRvYgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2dldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfZ2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzI3CiAgICAvLyByZXR1cm4gc2VsZi5ib3hfbWFwW2tleV0KICAgIGl0b2IKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveF9tYXBfZGVsW3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF9kZWw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzEKICAgIC8vIGRlbCBzZWxmLmJveF9tYXBba2V5XQogICAgaXRvYgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9leGlzdHNbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMzNQogICAgLy8gcmV0dXJuIGtleSBpbiBzZWxmLmJveF9tYXAKICAgIGl0b2IKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyAHAQIACIAggiCqICYSA2JveAVCT1hfQwRibG9iCWJveF9sYXJnZQQVH3x1BWJveF9hBWJveF9kAWIOdG9vX21hbnlfYm9vbHMJbWFueV9pbnRzATAEAAI0MgVoZWxsbwNvY2EDdHhuAwaBAQdib3hfcmVmB2RlZmF1bHQxG0EA3jEZFEQxGESCGQTybG1CBO8YbPcEfTcpbgTxPdk3BDMyXT0EphdIEgT6vLiFBNVmxjIEBO9JcQQj7LMsBAGZQI0EdyBZygQBJj32BO73WBYEmWSXrgRs7HL/BG+dEHUEWe83YASqZmuWBN+91jYEtTKROgTCnxZpBJyIjAkE5vaFBgSO4sNkNhoAjhkAKQA4AFgB1gAfAgYCTAJdAp4AEwAKAxkDKwOEA+kECwTNAAEFjwW2Bf0GMAZDBlkGYgAnCIGdILlIIkMnCYGIILlIIkOCAgFkBAABAgO/IkMiQzEZFDEYFBBDIhYnDUy/gQYWJw5MvyJDJw2+REkXFkxLARJEJw6+REkXFkxLARJEUCcETFCwIkM2GgEXNhoCNhoDTwIWJwVMvycHvEgnB0sCvym8SClLAb9LAVcCACcGvEgnBksBvyuBkDC5SIEqFishBE8CuyshBIAIAAAAAAAAACq7JwW+RBeBAwgWJwVMvycFvUglEkQnB71ISwMVEkQpvURLAhVKEkQnBr1ISwMVShJEKSQiuksGVwABEkRLAyIJKUwiuksDIglLB0wiWBJEIksEDEsEIk8CTUsETAkpJE8CuiJLBA8iSwVPAk1LBEwJSwckTwJSEkQjSwQMTwQjTwJNKSRPArojSwQPI08FTwJNTwUkTwJSEkQnBiQiuk8EVwIBEkRLASIJJwZMIrpLASIJSwRMIlgSRCJLAgxLAiJPAk1LAkwJJwYkTwK6IksCDyJLA08CTUsCTAlLBCRPAlISRIEFSwIMSwKBBU8CTScGJE8CuoEFSwIPgQVLA08CTUsEJE8CUhJEI0sCDE8CI08CTScGJE8CuiNLAg8jTwNPAk1PAiRPAlISRCu9SIGQMBJDJwW9RQEnB71OAkgpvU4DSCu9TgRIgAEAJE8CVCJPAlQjTwJUgQNPAlQnBExQsCJDJwW+RBciCCIJJwe+RFcCACm+RCshBCW6F08DFksDFRZXBgJPBFBMgAIAFFBLARWBFAgWVwYCUE8CFlBMUExQJwRMULAiQyshBCW6FyIIFishBE8CuyJDJwW8SCcHvEgpvEgnBb5MF4EqSwFLA02BKhJEJwe+JwtOAk1XAgCAAjQyEkQpvicLTgJNJwsSREwURBREK7xIIkMnCrxIJwqAE1Rlc3RpbmcgdGVzdGluZyAxMjO/Jwq9SEkkSwJNgQdLAgxPAoEHTwJNSwEJJwpOArqAB1Rlc3RpbmcSRCm8SCmABwAFSGVsbG+/Kb1II0sBDEsBI08CTYEKSwIMTwKBCk8CTUsBCSlOArqABUhlbGxvEkM2GgEXNhoCTCULJwlMTwK7IkOAAEmBjlIyDA1BABixgQayEIEFshknD7IeJw+yHySyAbNC/98kRQEnCb1FAUQkRQJLAYGBBAxBABdLAUklCycJTCW6F0sCCEUCIghFAkL/4EkWJwRMULAiQyq9RQEURCqBILlEMQAyCiokSwO7KoHAPtMqJElLA9IqgUAnDLsqJIFFuksBSwNQJwxQEkQqvEgqvkkUREsBgAASREsDTgJNSwISRFAqvEgqTL8qvUiBQBJEJxCBILlIJxC8SCJDNhoBJFtENhoBSRUhBQgoTLlIKCEEgAIQArsoIQVPArsiQzYaARc2GgJJFyghBU8Du0kiCBYogY4gTwK7SSMIFiiBqCAjuhdLAw1EI0sDCyEGSwEIKEwjuhchBggoSwEjuhdLBQ1EIwhLBCULTEsBCChMTwS7SwKBAwgWKIGWIE8Cu0sCgQQIFiiBoCBPArtPAoEFCBYogYwgI7oXIQUIKEsBI7oXSwUNRCMISUsECChMI7oXCIESCChLASO6F0sFDUQjCElPBAgoTCO6FwgoSwEjuhdPBA1EIwhPAggoTE8CuyJDNhoBFzYaAhc2GgMXKCEFJboXKIGOICW6FyiBqCAjuhdLBQ1EI0sFCyEGSwEIKEwjuhchBggoSwEjuhdLBg1EIwhLBSULCChMJboXKIGWICW6FyiBoCAluhcogYwgI7oXIQUIKEsBI7oXTwoNRCMISU8FCChMI7oXCIESCChLASO6F0sIDUQjCCNPCAtLAQgoTCO6FwgoSwEjuhdLBw1EIwhPBiULCChMJboXTwVPBQhPBAhPAwhPAggIFicETFCwIkM2GgEXNhoCJFNLASUKTwIlGCcISwIiuksBJQxETE8DVCcITgK7IkM2GgEXJCcIvUUBRCRJgeiBAgxBAChHAiUKTCUYJwhPAiK6TFNBAAZLASIIRQJLAUsDEkAACEkiCEUBQv/PSwEWJwRMULAiQyQWSbxISYAGSG1tbW1tv71IgQYSRCIWSb4nEU4CTScREkRJvUUBFERJvEhJJwy/vEgiQzYaARc2GgJXAgBMFkm8SEy/IkM2GgEXFr5ESRUWVwYCTFAnBExQsCJDNhoBFxa8SCJDNhoBFxa9RQGAAQAkTwJUJwRMULAiQw==", + "approval": "CyAHAQIACIAggiCqICYSA2JveAVCT1hfQwRibG9iCWJveF9sYXJnZQQVH3x1BWJveF9hBWJveF9kAWIOdG9vX21hbnlfYm9vbHMJbWFueV9pbnRzATAEAAI0MgVoZWxsbwNvY2EDdHhuAwaBAQdib3hfcmVmB2RlZmF1bHQxG0EA3jEZFEQxGESCGQTybG1CBO8YbPcEfTcpbgTxPdk3BDMyXT0EphdIEgT6vLiFBNVmxjIEBO9JcQQj7LMsBAGZQI0EdyBZygQBJj32BO73WBYEmWSXrgRs7HL/BG+dEHUEWe83YASqZmuWBN+91jYEtTKROgTCnxZpBJyIjAkE5vaFBgSO4sNkNhoAjhkAKwA6AFoB2AAfAggCTgJfAqAAEwAKAxsDLQOGA+sEDQTPAAEFkQW4Bf8GMgZFBlsGZAAnCIGdILlIIkMnCYGIILlIIkOCAgFkBAABAgO/IkMiQzEZFDEYFBBEIkMiFicNTL+BBhYnDky/IkMnDb5ESRcWTEsBEkQnDr5ESRcWTEsBEkRQJwRMULAiQzYaARc2GgI2GgNPAhYnBUy/Jwe8SCcHSwK/KbxIKUsBv0sBVwIAJwa8SCcGSwG/K4GQMLlIgSoWKyEETwK7KyEEgAgAAAAAAAAAKrsnBb5EF4EDCBYnBUy/JwW9SCUSRCcHvUhLAxUSRCm9REsCFUoSRCcGvUhLAxVKEkQpJCK6SwZXAAESREsDIgkpTCK6SwMiCUsHTCJYEkQiSwQMSwQiTwJNSwRMCSkkTwK6IksEDyJLBU8CTUsETAlLByRPAlISRCNLBAxPBCNPAk0pJE8CuiNLBA8jTwVPAk1PBSRPAlISRCcGJCK6TwRXAgESREsBIgknBkwiuksBIglLBEwiWBJEIksCDEsCIk8CTUsCTAknBiRPAroiSwIPIksDTwJNSwJMCUsEJE8CUhJEgQVLAgxLAoEFTwJNJwYkTwK6gQVLAg+BBUsDTwJNSwQkTwJSEkQjSwIMTwIjTwJNJwYkTwK6I0sCDyNPA08CTU8CJE8CUhJEK71IgZAwEkMnBb1FAScHvU4CSCm9TgNIK71OBEiAAQAkTwJUIk8CVCNPAlSBA08CVCcETFCwIkMnBb5EFyIIIgknB75EVwIAKb5EKyEEJboXTwMWSwMVFlcGAk8EUEyAAgAUUEsBFYEUCBZXBgJQTwIWUExQTFAnBExQsCJDKyEEJboXIggWKyEETwK7IkMnBbxIJwe8SCm8SCcFvkwXgSpLAUsDTYEqEkQnB74nC04CTVcCAIACNDISRCm+JwtOAk0nCxJETBREFEQrvEgiQycKvEgnCoATVGVzdGluZyB0ZXN0aW5nIDEyM78nCr1ISSRLAk2BB0sCDE8CgQdPAk1LAQknCk4CuoAHVGVzdGluZxJEKbxIKYAHAAVIZWxsb78pvUgjSwEMSwEjTwJNgQpLAgxPAoEKTwJNSwEJKU4CuoAFSGVsbG8SQzYaARc2GgJMJQsnCUxPArsiQ4AASYGOUjIMDUEAGLGBBrIQgQWyGScPsh4nD7IfJLIBs0L/3yRFAScJvUUBRCRFAksBgYEEDEEAF0sBSSULJwlMJboXSwIIRQIiCEUCQv/gSRYnBExQsCJDKr1FARREKoEguUQxADIKKiRLA7sqgcA+0yokSUsD0iqBQCcMuyokgUW6SwFLA1AnDFASRCq8SCq+SRRESwGAABJESwNOAk1LAhJEUCq8SCpMvyq9SIFAEkQnEIEguUgnELxIIkM2GgEkW0Q2GgFJFSEFCChMuUgoIQSAAhACuyghBU8CuyJDNhoBFzYaAkkXKCEFTwO7SSIIFiiBjiBPArtJIwgWKIGoICO6F0sDDUQjSwMLIQZLAQgoTCO6FyEGCChLASO6F0sFDUQjCEsEJQtMSwEIKExPBLtLAoEDCBYogZYgTwK7SwKBBAgWKIGgIE8Cu08CgQUIFiiBjCAjuhchBQgoSwEjuhdLBQ1EIwhJSwQIKEwjuhcIgRIIKEsBI7oXSwUNRCMISU8ECChMI7oXCChLASO6F08EDUQjCE8CCChMTwK7IkM2GgEXNhoCFzYaAxcoIQUluhcogY4gJboXKIGoICO6F0sFDUQjSwULIQZLAQgoTCO6FyEGCChLASO6F0sGDUQjCEsFJQsIKEwluhcogZYgJboXKIGgICW6FyiBjCAjuhchBQgoSwEjuhdPCg1EIwhJTwUIKEwjuhcIgRIIKEsBI7oXSwgNRCMII08IC0sBCChMI7oXCChLASO6F0sHDUQjCE8GJQsIKEwluhdPBU8FCE8ECE8DCE8CCAgWJwRMULAiQzYaARc2GgIkU0sBJQpPAiUYJwhLAiK6SwElDERMTwNUJwhOArsiQzYaARckJwi9RQFEJEmB6IECDEEAKEcCJQpMJRgnCE8CIrpMU0EABksBIghFAksBSwMSQAAISSIIRQFC/89LARYnBExQsCJDJBZJvEhJgAZIbW1tbW2/vUiBBhJEIhZJvicRTgJNJxESREm9RQEUREm8SEknDL+8SCJDNhoBFzYaAlcCAEwWSbxITL8iQzYaARcWvkRJFRZXBgJMUCcETFCwIkM2GgEXFrxIIkM2GgEXFr1FAYABACRPAlQnBExQsCJD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/Contains/data/MyContract.approval.teal b/tests/artifacts/Contains/data/MyContract.approval.teal index 977f6de..f474884 100644 --- a/tests/artifacts/Contains/data/MyContract.approval.teal +++ b/tests/artifacts/Contains/data/MyContract.approval.teal @@ -95,9 +95,11 @@ main: // tests/artifacts/Contains/contract.py:32 // assert not three_false, "Should be false" ! + assert // Should be false // tests/artifacts/Contains/contract.py:37 // return UInt64(1) - return // on error: Should be false + intc_1 // 1 + return // tests.artifacts.Contains.contract.MyContract.is_in_tuple_1(x: uint64, y.0: uint64, y.1: uint64, y.2: bytes) -> uint64: diff --git a/tests/artifacts/CreatedAppAsset/data/AppCall.approval.teal b/tests/artifacts/CreatedAppAsset/data/AppCall.approval.teal index 33ba58c..f493b90 100644 --- a/tests/artifacts/CreatedAppAsset/data/AppCall.approval.teal +++ b/tests/artifacts/CreatedAppAsset/data/AppCall.approval.teal @@ -28,7 +28,9 @@ main___algopy_default_create@5: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + pushint 1 // 1 + return // tests.artifacts.CreatedAppAsset.other.AppCall.some_value[routing]() -> void: diff --git a/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json b/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json index 9139b78..9f99988 100644 --- a/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json +++ b/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json @@ -76,19 +76,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NAogICAgLy8gY2xhc3MgQXBwQ2FsbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3NvbWVfdmFsdWVfcm91dGVAMwogICAgZXJyCgptYWluX3NvbWVfdmFsdWVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBzb21lX3ZhbHVlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3JlYXRlZEFwcEFzc2V0Lm90aGVyLkFwcENhbGwuc29tZV92YWx1ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNvbWVfdmFsdWU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L290aGVyLnB5OjcKICAgIC8vIHJldHVybiBHbG9iYWwuZ3JvdXBfc2l6ZSAqIChUeG4uZ3JvdXBfaW5kZXggKyAxKQogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMSAvLyAxCiAgICArCiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L290aGVyLnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NAogICAgLy8gY2xhc3MgQXBwQ2FsbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3NvbWVfdmFsdWVfcm91dGVAMwogICAgZXJyCgptYWluX3NvbWVfdmFsdWVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBzb21lX3ZhbHVlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcmVhdGVkQXBwQXNzZXQub3RoZXIuQXBwQ2FsbC5zb21lX3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKc29tZV92YWx1ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NwogICAgLy8gcmV0dXJuIEdsb2JhbC5ncm91cF9zaXplICogKFR4bi5ncm91cF9pbmRleCArIDEpCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAxIC8vIDEKICAgICsKICAgICoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CzEbQQAYgATTR55lNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEMyBDEWgQEICxaABBUffHVMULCBAUM=", + "approval": "CzEbQQAYgATTR55lNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUMyBDEWgQEICxaABBUffHVMULCBAUM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.approval.teal b/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.approval.teal index 95cb70c..ca9a0cc 100644 --- a/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.approval.teal +++ b/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.approval.teal @@ -25,7 +25,9 @@ main___algopy_default_create@9: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.CreatedAppAsset.contract.AppExpectingEffects.create_group[routing]() -> void: diff --git a/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json b/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json index 67e39e9..82abebf 100644 --- a/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json +++ b/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json @@ -99,56 +99,56 @@ }, { "pc": [ - 159 + 161 ], "errorMessage": "application log value is not the result of an ABI return" }, { "pc": [ - 96 + 98 ], "errorMessage": "expected app created" }, { "pc": [ - 81 + 83 ], "errorMessage": "expected asset created" }, { "pc": [ - 105 + 107 ], "errorMessage": "expected correct app id" }, { "pc": [ - 90 + 92 ], "errorMessage": "expected correct asset id" }, { "pc": [ - 139 + 141 ], "errorMessage": "expected correct method called" }, { "pc": [ - 145 + 147 ], "errorMessage": "expected logs" }, { "pc": [ - 65 + 67 ], "errorMessage": "transaction type is acfg" }, { "pc": [ - 75, - 126 + 77, + 128 ], "errorMessage": "transaction type is appl" } @@ -161,19 +161,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDZkM2EwNDM5IDB4NjJhMGVmNjIgLy8gbWV0aG9kICJjcmVhdGVfZ3JvdXAoYWNmZyxhcHBsKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAibG9nX2dyb3VwKGFwcGwpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZV9ncm91cCBsb2dfZ3JvdXAKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmNyZWF0ZV9ncm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZV9ncm91cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyIC8vIDIKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgMyAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWNmZwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTEKICAgIC8vIGFzc2VydCBhc3NldF9jcmVhdGUuY3JlYXRlZF9hc3NldC5pZCwgImV4cGVjdGVkIGFzc2V0IGNyZWF0ZWQiCiAgICBkaWcgMQogICAgZ3R4bnMgQ3JlYXRlZEFzc2V0SUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IGNyZWF0ZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTMKICAgIC8vIG9wLmdhaWQoYXNzZXRfY3JlYXRlLmdyb3VwX2luZGV4KSA9PSBhc3NldF9jcmVhdGUuY3JlYXRlZF9hc3NldC5pZAogICAgdW5jb3ZlciAyCiAgICBndHhucyBHcm91cEluZGV4CiAgICBnYWlkcwogICAgZGlnIDEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjEyLTE0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG9wLmdhaWQoYXNzZXRfY3JlYXRlLmdyb3VwX2luZGV4KSA9PSBhc3NldF9jcmVhdGUuY3JlYXRlZF9hc3NldC5pZAogICAgLy8gKSwgImV4cGVjdGVkIGNvcnJlY3QgYXNzZXQgaWQiCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBhc3NldCBpZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxNQogICAgLy8gYXNzZXJ0IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQsICJleHBlY3RlZCBhcHAgY3JlYXRlZCIKICAgIGRpZyAxCiAgICBndHhucyBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwIGNyZWF0ZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTcKICAgIC8vIG9wLmdhaWQoYXBwX2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXBwX2NyZWF0ZS5jcmVhdGVkX2FwcC5pZAogICAgdW5jb3ZlciAyCiAgICBndHhucyBHcm91cEluZGV4CiAgICBnYWlkcwogICAgZGlnIDEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjE2LTE4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG9wLmdhaWQoYXBwX2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXBwX2NyZWF0ZS5jcmVhdGVkX2FwcC5pZAogICAgLy8gKSwgImV4cGVjdGVkIGNvcnJlY3QgYXBwIGlkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgYXBwIGlkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmxvZ19ncm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmxvZ19ncm91cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBhcHBfY2FsbC5hcHBfYXJncygwKSA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKAogICAgZHVwCiAgICBwdXNoaW50IDAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjQtMjYKICAgIC8vIGFzc2VydCBhcHBfY2FsbC5hcHBfYXJncygwKSA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKAogICAgLy8gICAgICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICAvLyApLCAiZXhwZWN0ZWQgY29ycmVjdCBtZXRob2QgY2FsbGVkIgogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbWV0aG9kIGNhbGxlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyNwogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLm51bV9sb2dzID09IDEsICJleHBlY3RlZCBsb2dzIgogICAgZHVwCiAgICBndHhucyBOdW1Mb2dzCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBsb2dzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI5CiAgICAvLyBhcmM0LlVJbnQ2NC5mcm9tX2xvZyhhcHBfY2FsbC5sYXN0X2xvZykKICAgIGR1cAogICAgZ3R4bnMgTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBsb2cgdmFsdWUgaXMgbm90IHRoZSByZXN1bHQgb2YgYW4gQUJJIHJldHVybgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTozMAogICAgLy8gPT0gKGFwcF9jYWxsLmdyb3VwX2luZGV4ICsgMSkgKiBHbG9iYWwuZ3JvdXBfc2l6ZQogICAgc3dhcAogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGdsb2JhbCBHcm91cFNpemUKICAgICoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjktMzAKICAgIC8vIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgLy8gPT0gKGFwcF9jYWxsLmdyb3VwX2luZGV4ICsgMSkgKiBHbG9iYWwuZ3JvdXBfc2l6ZQogICAgaXRvYgogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDZkM2EwNDM5IDB4NjJhMGVmNjIgLy8gbWV0aG9kICJjcmVhdGVfZ3JvdXAoYWNmZyxhcHBsKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAibG9nX2dyb3VwKGFwcGwpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZV9ncm91cCBsb2dfZ3JvdXAKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3JlYXRlZEFwcEFzc2V0LmNvbnRyYWN0LkFwcEV4cGVjdGluZ0VmZmVjdHMuY3JlYXRlX2dyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlX2dyb3VwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCAzIC8vIGFjZmcKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhY2ZnCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxMQogICAgLy8gYXNzZXJ0IGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkLCAiZXhwZWN0ZWQgYXNzZXQgY3JlYXRlZCIKICAgIGRpZyAxCiAgICBndHhucyBDcmVhdGVkQXNzZXRJRAogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgY3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxMwogICAgLy8gb3AuZ2FpZChhc3NldF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkCiAgICB1bmNvdmVyIDIKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIGdhaWRzCiAgICBkaWcgMQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTItMTQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb3AuZ2FpZChhc3NldF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkCiAgICAvLyApLCAiZXhwZWN0ZWQgY29ycmVjdCBhc3NldCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGFzc2V0IGlkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjE1CiAgICAvLyBhc3NlcnQgYXBwX2NyZWF0ZS5jcmVhdGVkX2FwcC5pZCwgImV4cGVjdGVkIGFwcCBjcmVhdGVkIgogICAgZGlnIDEKICAgIGd0eG5zIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcHAgY3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxNwogICAgLy8gb3AuZ2FpZChhcHBfY3JlYXRlLmdyb3VwX2luZGV4KSA9PSBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkCiAgICB1bmNvdmVyIDIKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIGdhaWRzCiAgICBkaWcgMQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTYtMTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb3AuZ2FpZChhcHBfY3JlYXRlLmdyb3VwX2luZGV4KSA9PSBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkCiAgICAvLyApLCAiZXhwZWN0ZWQgY29ycmVjdCBhcHAgaWQiCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3JlYXRlZEFwcEFzc2V0LmNvbnRyYWN0LkFwcEV4cGVjdGluZ0VmZmVjdHMubG9nX2dyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKbG9nX2dyb3VwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLmFwcF9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICBkdXAKICAgIHB1c2hpbnQgMCAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyNC0yNgogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLmFwcF9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IG1ldGhvZCBjYWxsZWQiCiAgICBwdXNoYnl0ZXMgMHhkMzQ3OWU2NSAvLyBtZXRob2QgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBtZXRob2QgY2FsbGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwubnVtX2xvZ3MgPT0gMSwgImV4cGVjdGVkIGxvZ3MiCiAgICBkdXAKICAgIGd0eG5zIE51bUxvZ3MKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjkKICAgIC8vIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgZHVwCiAgICBndHhucyBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjMwCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBzd2FwCiAgICBndHhucyBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyOS0zMAogICAgLy8gYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBpdG9iCiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyACAQYmAQQVH3x1MRtBAB0xGRREMRhEggIEbToEOQRioO9iNhoAjgIACQBIADEZFDEYFBBDMRaBAglJOBCBAxJEMRYiCUk4ECMSREsBODxJRE8COBY9SwESREsBOD1JRE8COBY9SwESREwWTBZQKExQsCJDMRYiCUk4ECMSREmBAMIagATTR55lEkRJODsiEkRJOD5JVwQATFcABCgSREw4FiIIMgQLFqhD", + "approval": "CyACAQYmAQQVH3x1MRtBAB0xGRREMRhEggIEbToEOQRioO9iNhoAjgIACwBKADEZFDEYFBBEIkMxFoECCUk4EIEDEkQxFiIJSTgQIxJESwE4PElETwI4Fj1LARJESwE4PUlETwI4Fj1LARJETBZMFlAoTFCwIkMxFiIJSTgQIxJESYEAwhqABNNHnmUSREk4OyISREk4PklXBABMVwAEKBJETDgWIggyBAsWqEM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal b/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal index 712d353..5e686b8 100644 --- a/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal +++ b/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal @@ -25,7 +25,9 @@ main___algopy_default_create@20: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_1 // 1 + return // _puya_lib.util.ensure_budget(required_budget: uint64, fee_source: uint64) -> void: diff --git a/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json b/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json index 35e717f..fccf49e 100644 --- a/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json +++ b/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json @@ -430,19 +430,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzAwMCA0CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMCAweDE1MWY3Yzc1MDAyMCAweDAwMDQgMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ3J5cHRvT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDM0NTZjNGMzIDB4ZTg0NDJiODQgMHg2NWY1NjdhYSAweDI1ODQ1NWIxIDB4MzVhZjBmMzggMHg2NTgyYzk5NyAweDYyOThmZmJiIDB4Mzg4NWI1NGYgMHgyMTY0ZTBiZiAweDc1NWI3OWE1IDB4ZjA2YmIwNzcgMHgxMzNmOGNjYyAweDJmN2M2OGE5IC8vIG1ldGhvZCAidmVyaWZ5X3NoYTI1NihieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NoYTNfMjU2KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfa2VjY2FrXzI1NihieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NoYTUxMl8yNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9lZDI1NTE5dmVyaWZ5KGJ5dGVbXSxieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmUoYnl0ZVtdLGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMShieXRlW10sYnl0ZVtdLGJ5dGVbXSxieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lY2RzYV92ZXJpZnlfcjEoYnl0ZVtdLGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfcmVjb3Zlcl9rMShieXRlW10sdWludDY0LGJ5dGVbXSxieXRlW10pKGJ5dGVbXSxieXRlW10pIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfcmVjb3Zlcl9yMShieXRlW10sdWludDY0LGJ5dGVbXSxieXRlW10pKGJ5dGVbXSxieXRlW10pIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19rMShieXRlW10pKGJ5dGVbXSxieXRlW10pIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19yMShieXRlW10pKGJ5dGVbXSxieXRlW10pIiwgbWV0aG9kICJ2ZXJpZnlfdnJmX3ZlcmlmeShieXRlW10sYnl0ZVtdLGJ5dGVbXSkoYnl0ZVtdLGJvb2wpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X3NoYTI1NiB2ZXJpZnlfc2hhM18yNTYgdmVyaWZ5X2tlY2Nha18yNTYgdmVyaWZ5X3NoYTUxMl8yNTYgdmVyaWZ5X2VkMjU1MTl2ZXJpZnkgdmVyaWZ5X2VkMjU1MTl2ZXJpZnlfYmFyZSB2ZXJpZnlfZWNkc2FfdmVyaWZ5X2sxIHZlcmlmeV9lY2RzYV92ZXJpZnlfcjEgdmVyaWZ5X2VjZHNhX3JlY292ZXJfazEgdmVyaWZ5X2VjZHNhX3JlY292ZXJfcjEgdmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfazEgdmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfcjEgdmVyaWZ5X3ZyZl92ZXJpZnkKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2OgogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTI1NjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihhKQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X3NoYTNfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTNfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhM18yNTYoYSkKICAgIHNoYTNfMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9rZWNjYWtfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2tlY2Nha18yNTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyByZXN1bHQgPSBvcC5rZWNjYWsyNTYoYSkKICAgIGtlY2NhazI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhNTEyXzI1Nltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zaGE1MTJfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyNgogICAgLy8gcmVzdWx0ID0gb3Auc2hhNTEyXzI1NihhKQogICAgc2hhNTEyXzI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWQyNTUxOXZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lZDI1NTE5dmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzEKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMCAvLyAxOTAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjMyCiAgICAvLyByZXN1bHQgPSBvcC5lZDI1NTE5dmVyaWZ5KGEsIGIsIGMpCiAgICBlZDI1NTE5dmVyaWZ5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjMzCiAgICAvLyByZXR1cm4gYXJjNC5Cb29sKHJlc3VsdCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X2VkMjU1MTl2ZXJpZnlfYmFyZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozNwogICAgLy8gZW5zdXJlX2J1ZGdldCgxOTAwLCBPcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCAxOTAwIC8vIDE5MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzgKICAgIC8vIHJlc3VsdCA9IG9wLmVkMjU1MTl2ZXJpZnlfYmFyZShhLCBiLCBjKQogICAgZWQyNTUxOXZlcmlmeV9iYXJlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXR1cm4gYXJjNC5Cb29sKHJlc3VsdCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV92ZXJpZnlfazE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDMwMDAsIE9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpCiAgICBpbnRjXzIgLy8gMzAwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0NAogICAgLy8gcmVzdWx0X2sxID0gb3AuZWNkc2FfdmVyaWZ5KG9wLkVDRFNBLlNlY3AyNTZrMSwgYSwgYiwgYywgZCwgZSkKICAgIGVjZHNhX3ZlcmlmeSBTZWNwMjU2azEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X2VjZHNhX3ZlcmlmeV9yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV92ZXJpZnlfcjE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDMwMDAsIE9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpCiAgICBpbnRjXzIgLy8gMzAwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MAogICAgLy8gcmVzdWx0X3IxID0gb3AuZWNkc2FfdmVyaWZ5KG9wLkVDRFNBLlNlY3AyNTZyMSwgYSwgYiwgYywgZCwgZSkKICAgIGVjZHNhX3ZlcmlmeSBTZWNwMjU2cjEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X2VjZHNhX3JlY292ZXJfazFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZWNkc2FfcmVjb3Zlcl9rMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDMwMDAsIE9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpCiAgICBpbnRjXzIgLy8gMzAwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1OAogICAgLy8gcmV0dXJuIG9wLmVjZHNhX3BrX3JlY292ZXIob3AuRUNEU0EuU2VjcDI1NmsxLCBhLCBiLCBjLCBkKQogICAgZWNkc2FfcGtfcmVjb3ZlciBTZWNwMjU2azEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMyAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X2VjZHNhX3JlY292ZXJfcjFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZWNkc2FfcmVjb3Zlcl9yMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDMwMDAsIE9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpCiAgICBpbnRjXzIgLy8gMzAwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2OAogICAgLy8gcmV0dXJuIG9wLmVjZHNhX3BrX3JlY292ZXIob3AuRUNEU0EuU2VjcDI1NnIxLCBhLCBiLCBjLCBkKQogICAgZWNkc2FfcGtfcmVjb3ZlciBTZWNwMjU2cjEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMyAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfazFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19rMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MgogICAgLy8gZW5zdXJlX2J1ZGdldCg3MDAsIE9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpCiAgICBwdXNoaW50IDcwMCAvLyA3MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NzMKICAgIC8vIHJldHVybiBvcC5lY2RzYV9wa19kZWNvbXByZXNzKG9wLkVDRFNBLlNlY3AyNTZrMSwgYSkKICAgIGVjZHNhX3BrX2RlY29tcHJlc3MgU2VjcDI1NmsxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzMgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfcjE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NzcKICAgIC8vIGVuc3VyZV9idWRnZXQoNzAwLCBPcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCA3MDAgLy8gNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2cjEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfdnJmX3ZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV92cmZfdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6ODIKICAgIC8vIGVuc3VyZV9idWRnZXQoNTcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNTcwMCAvLyA1NzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgzCiAgICAvLyByZXN1bHQgPSBvcC52cmZfdmVyaWZ5KG9wLlZyZlZlcmlmeS5WcmZBbGdvcmFuZCwgYSwgYiwgYykKICAgIHZyZl92ZXJpZnkgVnJmQWxnb3JhbmQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoYnl0ZXMgMHgwMDAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzAwMCA0CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMCAweDE1MWY3Yzc1MDAyMCAweDAwMDQgMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ3J5cHRvT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDM0NTZjNGMzIDB4ZTg0NDJiODQgMHg2NWY1NjdhYSAweDI1ODQ1NWIxIDB4MzVhZjBmMzggMHg2NTgyYzk5NyAweDYyOThmZmJiIDB4Mzg4NWI1NGYgMHgyMTY0ZTBiZiAweDc1NWI3OWE1IDB4ZjA2YmIwNzcgMHgxMzNmOGNjYyAweDJmN2M2OGE5IC8vIG1ldGhvZCAidmVyaWZ5X3NoYTI1NihieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NoYTNfMjU2KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfa2VjY2FrXzI1NihieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NoYTUxMl8yNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9lZDI1NTE5dmVyaWZ5KGJ5dGVbXSxieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmUoYnl0ZVtdLGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMShieXRlW10sYnl0ZVtdLGJ5dGVbXSxieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lY2RzYV92ZXJpZnlfcjEoYnl0ZVtdLGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfcmVjb3Zlcl9rMShieXRlW10sdWludDY0LGJ5dGVbXSxieXRlW10pKGJ5dGVbXSxieXRlW10pIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfcmVjb3Zlcl9yMShieXRlW10sdWludDY0LGJ5dGVbXSxieXRlW10pKGJ5dGVbXSxieXRlW10pIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19rMShieXRlW10pKGJ5dGVbXSxieXRlW10pIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19yMShieXRlW10pKGJ5dGVbXSxieXRlW10pIiwgbWV0aG9kICJ2ZXJpZnlfdnJmX3ZlcmlmeShieXRlW10sYnl0ZVtdLGJ5dGVbXSkoYnl0ZVtdLGJvb2wpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X3NoYTI1NiB2ZXJpZnlfc2hhM18yNTYgdmVyaWZ5X2tlY2Nha18yNTYgdmVyaWZ5X3NoYTUxMl8yNTYgdmVyaWZ5X2VkMjU1MTl2ZXJpZnkgdmVyaWZ5X2VkMjU1MTl2ZXJpZnlfYmFyZSB2ZXJpZnlfZWNkc2FfdmVyaWZ5X2sxIHZlcmlmeV9lY2RzYV92ZXJpZnlfcjEgdmVyaWZ5X2VjZHNhX3JlY292ZXJfazEgdmVyaWZ5X2VjZHNhX3JlY292ZXJfcjEgdmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfazEgdmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfcjEgdmVyaWZ5X3ZyZl92ZXJpZnkKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9zaGEyNTZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2hhMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NwogICAgLy8gYSA9IG9wLmJ6ZXJvKHBhZF9zaXplKSArIGEKICAgIGJ6ZXJvCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6OAogICAgLy8gcmVzdWx0ID0gb3Auc2hhMjU2KGEpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhM18yNTZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2hhM18yNTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTMKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjE0CiAgICAvLyByZXN1bHQgPSBvcC5zaGEzXzI1NihhKQogICAgc2hhM18yNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X2tlY2Nha18yNTZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfa2VjY2FrXzI1NjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxOQogICAgLy8gYSA9IG9wLmJ6ZXJvKHBhZF9zaXplKSArIGEKICAgIGJ6ZXJvCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MjAKICAgIC8vIHJlc3VsdCA9IG9wLmtlY2NhazI1NihhKQogICAga2VjY2FrMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9zaGE1MTJfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTUxMl8yNTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MjUKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjI2CiAgICAvLyByZXN1bHQgPSBvcC5zaGE1MTJfMjU2KGEpCiAgICBzaGE1MTJfMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9lZDI1NTE5dmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VkMjU1MTl2ZXJpZnk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMQogICAgLy8gZW5zdXJlX2J1ZGdldCgxOTAwLCBPcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCAxOTAwIC8vIDE5MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzIKICAgIC8vIHJlc3VsdCA9IG9wLmVkMjU1MTl2ZXJpZnkoYSwgYiwgYykKICAgIGVkMjU1MTl2ZXJpZnkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkJvb2wocmVzdWx0KQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VkMjU1MTl2ZXJpZnlfYmFyZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDE5MDAsIE9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpCiAgICBwdXNoaW50IDE5MDAgLy8gMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozOAogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeV9iYXJlKGEsIGIsIGMpCiAgICBlZDI1NTE5dmVyaWZ5X2JhcmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzkKICAgIC8vIHJldHVybiBhcmM0LkJvb2wocmVzdWx0KQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X2sxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDMKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXN1bHRfazEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NmsxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9yMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUwCiAgICAvLyByZXN1bHRfcjEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NnIxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2azEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NjcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2cjEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwIC8vIDcwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MwogICAgLy8gcmV0dXJuIG9wLmVjZHNhX3BrX2RlY29tcHJlc3Mob3AuRUNEU0EuU2VjcDI1NmsxLCBhKQogICAgZWNkc2FfcGtfZGVjb21wcmVzcyBTZWNwMjU2azEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMyAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfcjFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19yMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NwogICAgLy8gZW5zdXJlX2J1ZGdldCg3MDAsIE9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpCiAgICBwdXNoaW50IDcwMCAvLyA3MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NzgKICAgIC8vIHJldHVybiBvcC5lY2RzYV9wa19kZWNvbXByZXNzKG9wLkVDRFNBLlNlY3AyNTZyMSwgYSkKICAgIGVjZHNhX3BrX2RlY29tcHJlc3MgU2VjcDI1NnIxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzMgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV92cmZfdmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3ZyZl92ZXJpZnk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlX2J1ZGdldCg1NzAwLCBPcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCA1NzAwIC8vIDU3MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6ODMKICAgIC8vIHJlc3VsdCA9IG9wLnZyZl92ZXJpZnkob3AuVnJmVmVyaWZ5LlZyZkFsZ29yYW5kLCBhLCBiLCBjKQogICAgdnJmX3ZlcmlmeSBWcmZBbGdvcmFuZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyAEAAG4FwQmBQQVH3x1AQAGFR98dQAgAgAEAwaBATEbQQBqMRkURDEYRIINBDRWxMME6EQrhARl9WeqBCWEVbEENa8POARlgsmXBGKY/7sEOIW1TwQhZOC/BHVbeaUE8GuwdwQTP4zMBC98aKk2GgCODQBEAFgAbACAAJQAuQDeAQ4BPgGGAc4CCAJCADEZFDEYFBBDigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScEsh4nBLIfi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74k2GgFXAgA2GgIXr0xQASpMULAjQzYaAVcCADYaAhevTFCYKkxQsCNDNhoBVwIANhoCF69MUAIqTFCwI0M2GgFXAgA2GgIXr0xQAypMULAjQzYaAVcCADYaAlcCADYaA1cCAIHsDiKI/1wEKSJPAlQoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCB7A4iiP83hCkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/wgFACkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/tgFASkiTwJUKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP6wBwBLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP5oBwFLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIAgbwFIoj+LgYASwEVFlcGAk8CUEkVJQhLAhUWVwYCTwNQTBZXBgIrTFBPAlBMUChMULAjQzYaAVcCAIG8BSKI/fQGAUsBFRZXBgJPAlBJFSUISwIVFlcGAk8DUEwWVwYCK0xQTwJQTFAoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCBxCwiiP2u0ABLARUWVwYCTwJQKSJPA1SAAgADTFBMUChMULAjQw==", + "approval": "CyAEAAG4FwQmBQQVH3x1AQAGFR98dQAgAgAEAwaBATEbQQBqMRkURDEYRIINBDRWxMME6EQrhARl9WeqBCWEVbEENa8POARlgsmXBGKY/7sEOIW1TwQhZOC/BHVbeaUE8GuwdwQTP4zMBC98aKk2GgCODQBGAFoAbgCCAJYAuwDgARABQAGIAdACCgJEADEZFDEYFBBEI0OKAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJwSyHicEsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viTYaAVcCADYaAhevTFABKkxQsCNDNhoBVwIANhoCF69MUJgqTFCwI0M2GgFXAgA2GgIXr0xQAipMULAjQzYaAVcCADYaAhevTFADKkxQsCNDNhoBVwIANhoCVwIANhoDVwIAgewOIoj/XAQpIk8CVChMULAjQzYaAVcCADYaAlcCADYaA1cCAIHsDiKI/zeEKSJPAlQoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgA2GgRXAgA2GgVXAgAkIoj/CAUAKSJPAlQoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgA2GgRXAgA2GgVXAgAkIoj+2AUBKSJPAlQoTFCwI0M2GgFXAgA2GgIXNhoDVwIANhoEVwIAJCKI/rAHAEsBFRZXBgJPAlBJFSUISwIVFlcGAk8DUEwWVwYCK0xQTwJQTFAoTFCwI0M2GgFXAgA2GgIXNhoDVwIANhoEVwIAJCKI/mgHAUsBFRZXBgJPAlBJFSUISwIVFlcGAk8DUEwWVwYCK0xQTwJQTFAoTFCwI0M2GgFXAgCBvAUiiP4uBgBLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIAgbwFIoj99AYBSwEVFlcGAk8CUEkVJQhLAhUWVwYCTwNQTBZXBgIrTFBPAlBMUChMULAjQzYaAVcCADYaAlcCADYaA1cCAIHELCKI/a7QAEsBFRZXBgJPAlApIk8DVIACAANMUExQKExQsCND", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal b/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal index 1ee5ea8..6724700 100644 --- a/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal +++ b/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal @@ -29,7 +29,9 @@ main___algopy_default_create@5: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + pushint 1 // 1 + return // tests.artifacts.GlobalStateValidator.contract.GlobalStateValidator.validate_g_args[routing]() -> void: diff --git a/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json b/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json index e0610ce..f0a6f5d 100644 --- a/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json +++ b/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json @@ -78,7 +78,7 @@ }, { "pc": [ - 72 + 75 ], "errorMessage": "transaction type is appl" } @@ -91,19 +91,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHhjMGViNWM2NwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEdsb2JhbFN0YXRlVmFsaWRhdG9yKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBieXRlY18wIC8vIG1ldGhvZCAidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmFsaWRhdGVfZ19hcmdzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92YWxpZGF0ZV9nX2FyZ3Nfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiB2YWxpZGF0ZV9nX2FyZ3MKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5HbG9iYWxTdGF0ZVZhbGlkYXRvci5jb250cmFjdC5HbG9iYWxTdGF0ZVZhbGlkYXRvci52YWxpZGF0ZV9nX2FyZ3Nbcm91dGluZ10oKSAtPiB2b2lkOgp2YWxpZGF0ZV9nX2FyZ3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6NwogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoInZhbGlkYXRlX2dfYXJncyh1aW50NjQsc3RyaW5nKXZvaWQiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWNfMCAvLyBtZXRob2QgInZhbGlkYXRlX2dfYXJncyh1aW50NjQsc3RyaW5nKXZvaWQiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6OAogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpID09IGFyZzEuYnl0ZXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6OQogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9hcmdzKDIpID09IGFyZzIuYnl0ZXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMAogICAgLy8gYXNzZXJ0IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oVHhuLmdyb3VwX2luZGV4KS5hcHBfYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG4gR3JvdXBJbmRleAogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICBwdXNoaW50IDEgLy8gMQogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTEKICAgIC8vIGFzc2VydCBndHhuLlRyYW5zYWN0aW9uKFR4bi5ncm91cF9pbmRleCkuYXBwX2FyZ3MoMSkgPT0gYXJnMS5ieXRlcwogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMSAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMgogICAgLy8gYXNzZXJ0IG9wLkdUeG4uYXBwbGljYXRpb25fYXJncyhUeG4uZ3JvdXBfaW5kZXgsIDEpID09IGFyZzEuYnl0ZXMKICAgIHR4biBHcm91cEluZGV4CiAgICBndHhuc2EgQXBwbGljYXRpb25BcmdzIDEKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBvcC5UeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcmV0dXJuCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHhjMGViNWM2NwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEdsb2JhbFN0YXRlVmFsaWRhdG9yKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBieXRlY18wIC8vIG1ldGhvZCAidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmFsaWRhdGVfZ19hcmdzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92YWxpZGF0ZV9nX2FyZ3Nfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiB2YWxpZGF0ZV9nX2FyZ3MKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkdsb2JhbFN0YXRlVmFsaWRhdG9yLmNvbnRyYWN0Lkdsb2JhbFN0YXRlVmFsaWRhdG9yLnZhbGlkYXRlX2dfYXJnc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZhbGlkYXRlX2dfYXJnczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo3CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMCkgPT0gYXJjNC5hcmM0X3NpZ25hdHVyZSgidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBieXRlY18wIC8vIG1ldGhvZCAidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo4CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkgPT0gYXJnMS5ieXRlcwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo5CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikgPT0gYXJnMi5ieXRlcwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBhc3NlcnQgZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbihUeG4uZ3JvdXBfaW5kZXgpLmFwcF9hcmdzKDEpID09IGFyZzEuYnl0ZXMKICAgIHR4biBHcm91cEluZGV4CiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIHB1c2hpbnQgMSAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMQogICAgLy8gYXNzZXJ0IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwX2luZGV4KS5hcHBfYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAxIC8vIDEKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjEyCiAgICAvLyBhc3NlcnQgb3AuR1R4bi5hcHBsaWNhdGlvbl9hcmdzKFR4bi5ncm91cF9pbmRleCwgMSkgPT0gYXJnMS5ieXRlcwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGd0eG5zYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMwogICAgLy8gYXNzZXJ0IG9wLlR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpID09IGFyZzEuYnl0ZXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyYBBMDrXGcxG0EAEyg2GgCOAQABADEZFDEYEERCAAgxGRQxGBQQQzYaATYaAjYaACgSRDYaAUsCEkQ2GgISRDEWSTgQgQYSRIEBwhpLARJEMRaBAcIaSwESRDEWORoBSwESRDYaARJD", + "approval": "CyYBBMDrXGcxG0EAEyg2GgCOAQABADEZFDEYEERCAAsxGRQxGBQQRIEBQzYaATYaAjYaACgSRDYaAUsCEkQ2GgISRDEWSTgQgQYSRIEBwhpLARJEMRaBAcIaSwESRDEWORoBSwESRDYaARJD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal b/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal index 6731683..658ebb5 100644 --- a/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal +++ b/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal @@ -30,7 +30,9 @@ main___algopy_default_create@44: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.MiscellaneousOps.contract.MiscellaneousOpsContract.verify_addw[routing]() -> void: diff --git a/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json b/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json index 5fb01e8..67aeaed 100644 --- a/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json +++ b/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json @@ -992,19 +992,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDE1MWY3Yzc1MDAyMCAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDQ0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDQ1ODQ3ZWVhIDB4ZjU3YWNlYjUgMHg3ZDYzMTczMCAweGExYjI0NDQxIDB4Y2Q3YmUxYWMgMHg3Y2ZkYTY0YiAweDU0YTkxMGQ5IDB4YzQ2NTY4ZGUgMHg3YTQ2YTZhZSAweDA0MzcyMjA5IDB4N2U1ZjZkNzIgMHgyNGViY2Y4NCAweDljMGIzMzk3IDB4MGFkNDBkYTQgMHg5NTE3ODg3MCAweGRlZWRjOTliIDB4YWIyMTUwYmIgMHgwMmE1NDAxNyAweDNkYjY2YjQxIDB4NmUzZmYzOGMgMHg4ZjNiOWYxOCAweDE2MTY2ZjlhIDB4MmY0NzIwNjUgMHhkNWE3MzljMyAweDYxZjNiM2UxIDB4NTZjZjM2OGIgMHg5MTlmZmJkMiAweGFhZThiNjk3IDB4ODQ3NDIyYjEgMHhkNTI2MDMyNyAweDExNGM4YzZkIDB4MzllOWU2MmEgMHhkNmE0YzA1ZSAweDFlZjgxNTFhIDB4NjZkZDdmOTYgMHg0ZDllY2ViMiAweDE5YmE3MGVlIC8vIG1ldGhvZCAidmVyaWZ5X2FkZHcodWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybChieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYml0bGVuKGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2JpdGxlbih1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYnNxcnQoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J0b2koYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2J6ZXJvKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9jb25jYXQoYnl0ZVtdLGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Rpdm1vZHcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfZGl2dyh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9lcnIoKXZvaWQiLCBtZXRob2QgInZlcmlmeV9leHAodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHB3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdChieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X2Zyb21fMihieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF91aW50MTYoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X3VpbnQzMihieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3RfdWludDY0KGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZ2V0Yml0X2J5dGVzKGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2dldGJpdF91aW50NjQodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0Ynl0ZShieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2l0b2IodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X211bHcodWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInZlcmlmeV9yZXBsYWNlKGJ5dGVbXSx1aW50NjQsYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NlbGVjdF9ieXRlcyhieXRlW10sYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zZWxlY3RfdWludDY0KHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3NldGJpdF9ieXRlcyhieXRlW10sdWludDY0LGJvb2wpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2V0Yml0X3VpbnQ2NCh1aW50NjQsdWludDY0LGJvb2wpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc2V0Ynl0ZShieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGwodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zaHIodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zcXJ0KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zdWJzdHJpbmcoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfanNvbl9yZWZfc3RyaW5nKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfanNvbl9yZWZfdWludDY0KGJ5dGVbXSxieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfanNvbl9yZWZfb2JqZWN0KGJ5dGVbXSxieXRlW10pYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2FkZHcgdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmQgdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsIHZlcmlmeV9ieXRlc19iaXRsZW4gdmVyaWZ5X3VpbnQ2NF9iaXRsZW4gdmVyaWZ5X2JzcXJ0IHZlcmlmeV9idG9pIHZlcmlmeV9iemVybyB2ZXJpZnlfY29uY2F0IHZlcmlmeV9kaXZtb2R3IHZlcmlmeV9kaXZ3IG1haW5fdmVyaWZ5X2Vycl9yb3V0ZUAxNSB2ZXJpZnlfZXhwIHZlcmlmeV9leHB3IHZlcmlmeV9leHRyYWN0IHZlcmlmeV9leHRyYWN0X2Zyb21fMiB2ZXJpZnlfZXh0cmFjdF91aW50MTYgdmVyaWZ5X2V4dHJhY3RfdWludDMyIHZlcmlmeV9leHRyYWN0X3VpbnQ2NCB2ZXJpZnlfZ2V0Yml0X2J5dGVzIHZlcmlmeV9nZXRiaXRfdWludDY0IHZlcmlmeV9nZXRieXRlIHZlcmlmeV9pdG9iIHZlcmlmeV9tdWx3IHZlcmlmeV9yZXBsYWNlIHZlcmlmeV9zZWxlY3RfYnl0ZXMgdmVyaWZ5X3NlbGVjdF91aW50NjQgdmVyaWZ5X3NldGJpdF9ieXRlcyB2ZXJpZnlfc2V0Yml0X3VpbnQ2NCB2ZXJpZnlfc2V0Ynl0ZSB2ZXJpZnlfc2hsIHZlcmlmeV9zaHIgdmVyaWZ5X3NxcnQgdmVyaWZ5X3N1YnN0cmluZyB2ZXJpZnlfanNvbl9yZWZfc3RyaW5nIHZlcmlmeV9qc29uX3JlZl91aW50NjQgdmVyaWZ5X2pzb25fcmVmX29iamVjdAogICAgZXJyCgptYWluX3ZlcmlmeV9lcnJfcm91dGVAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo2OQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA0NDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYWRkd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hZGR3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIHJlc3VsdCA9IG9wLmFkZHcoYSwgYikKICAgIGFkZHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyCiAgICAvLyByZXN1bHQgPSBvcC5iYXNlNjRfZGVjb2RlKG9wLkJhc2U2NC5TdGRFbmNvZGluZywgYSkKICAgIGJhc2U2NF9kZWNvZGUgU3RkRW5jb2RpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIHJlc3VsdCA9IG9wLmJhc2U2NF9kZWNvZGUob3AuQmFzZTY0LlVSTEVuY29kaW5nLCBhKQogICAgYmFzZTY0X2RlY29kZSBVUkxFbmNvZGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfYml0bGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2JpdGxlbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyMwogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2JpdGxlbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfYml0bGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyOAogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnNxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnNxcnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNAogICAgLy8gcmVzdWx0ID0gb3AuYnNxcnQoYV9iaWd1aW50KQogICAgYnNxcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J0b2lbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnRvaToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBvcC5idG9pKGEpCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J6ZXJvW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J6ZXJvOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NAogICAgLy8gcmVzdWx0ID0gb3AuYnplcm8oYSkKICAgIGJ6ZXJvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2NvbmNhdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9jb25jYXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfYV9zaXplKSArIGEKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTAKICAgIC8vIGIgPSBvcC5iemVybyhwYWRfYl9zaXplKSArIGIKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTEKICAgIC8vIHJlc3VsdCA9IGEgKyBiCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyByZXN1bHQgPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9kaXZtb2R3W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Rpdm1vZHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyByZXN1bHQgPSBvcC5kaXZtb2R3KGEsIGIsIGMsIGQpCiAgICBkaXZtb2R3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Rpdndbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGl2dzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjQKICAgIC8vIHJlc3VsdCA9IG9wLmRpdncoYSwgYiwgYykKICAgIGRpdncKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXhwW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIHJlc3VsdCA9IG9wLmV4cChhLCBiKQogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4cHdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXhwdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzgKICAgIC8vIHJlc3VsdCA9IG9wLmV4cHcoYSwgYikKICAgIGV4cHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCBiLCBjKQogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfZnJvbV8yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfZnJvbV8yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4OAogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCAyLCAwKQogICAgZXh0cmFjdCA0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfdWludDE2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfdWludDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTMKICAgIC8vIHJlc3VsdCA9IG9wLmV4dHJhY3RfdWludDE2KGEsIGIpCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X3VpbnQzMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leHRyYWN0X3VpbnQzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXN1bHQgPSBvcC5leHRyYWN0X3VpbnQzMihhLCBiKQogICAgZXh0cmFjdF91aW50MzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3QzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9nZXRiaXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0Yml0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTA2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmVzdWx0ID0gb3AuZ2V0Yml0KGEsIGIpCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9nZXRiaXRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldGJpdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTMKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJpdChhLCBiKQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Ynl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExOAogICAgLy8gcmVzdWx0ID0gb3AuZ2V0Ynl0ZShhLCBiKQogICAgZ2V0Ynl0ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfaXRvYltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9pdG9iOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXN1bHQgPSBvcC5pdG9iKGEpCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9tdWx3W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X211bHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjgKICAgIC8vIHJlc3VsdCA9IG9wLm11bHcoYSwgYikKICAgIG11bHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfcmVwbGFjZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9yZXBsYWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzMKICAgIC8vIHJlc3VsdCA9IG9wLnJlcGxhY2UoYSwgYiwgYykKICAgIHJlcGxhY2UzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2VsZWN0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NlbGVjdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTM4CiAgICAvLyByZXN1bHQgPSBvcC5zZWxlY3RfYnl0ZXMoYSwgYiwgYykKICAgIHNlbGVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NlbGVjdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2VsZWN0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gcmVzdWx0ID0gb3Auc2VsZWN0X3VpbnQ2NChhLCBiLCBjKQogICAgc2VsZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZXRiaXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2V0Yml0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE0OAogICAgLy8gcmVzdWx0ID0gb3Auc2V0Yml0X2J5dGVzKGEsIGIsIGMpCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZXRiaXRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NldGJpdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTMKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJpdF91aW50NjQoYSwgYiwgYykKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Ynl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZXRieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gcmVzdWx0ID0gb3Auc2V0Ynl0ZShhLCBiLCBjKQogICAgc2V0Ynl0ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NobFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zaGw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNjMKICAgIC8vIHJlc3VsdCA9IG9wLnNobChhLCBiKQogICAgc2hsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zaHJbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2hyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTY4CiAgICAvLyByZXN1bHQgPSBvcC5zaHIoYSwgYikKICAgIHNocgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc3FydFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zcXJ0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTczCiAgICAvLyByZXN1bHQgPSBvcC5zcXJ0KGEpCiAgICBzcXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zdWJzdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3Vic3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gcmVzdWx0ID0gb3Auc3Vic3RyaW5nKGEsIGIsIGMpCiAgICBzdWJzdHJpbmczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfanNvbl9yZWZfc3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2pzb25fcmVmX3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTgzCiAgICAvLyByZXN1bHQgPSBvcC5Kc29uUmVmLmpzb25fc3RyaW5nKGEsIGIpCiAgICBqc29uX3JlZiBKU09OU3RyaW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfanNvbl9yZWZfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2pzb25fcmVmX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyByZXN1bHQgPSBvcC5Kc29uUmVmLmpzb25fdWludDY0KGEsIGIpCiAgICBqc29uX3JlZiBKU09OVWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9qc29uX3JlZl9vYmplY3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfanNvbl9yZWZfb2JqZWN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxOTMKICAgIC8vIHJlc3VsdCA9IG9wLkpzb25SZWYuanNvbl9vYmplY3QoYSwgYikKICAgIGpzb25fcmVmIEpTT05PYmplY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDE1MWY3Yzc1MDAyMCAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDQ0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDQ1ODQ3ZWVhIDB4ZjU3YWNlYjUgMHg3ZDYzMTczMCAweGExYjI0NDQxIDB4Y2Q3YmUxYWMgMHg3Y2ZkYTY0YiAweDU0YTkxMGQ5IDB4YzQ2NTY4ZGUgMHg3YTQ2YTZhZSAweDA0MzcyMjA5IDB4N2U1ZjZkNzIgMHgyNGViY2Y4NCAweDljMGIzMzk3IDB4MGFkNDBkYTQgMHg5NTE3ODg3MCAweGRlZWRjOTliIDB4YWIyMTUwYmIgMHgwMmE1NDAxNyAweDNkYjY2YjQxIDB4NmUzZmYzOGMgMHg4ZjNiOWYxOCAweDE2MTY2ZjlhIDB4MmY0NzIwNjUgMHhkNWE3MzljMyAweDYxZjNiM2UxIDB4NTZjZjM2OGIgMHg5MTlmZmJkMiAweGFhZThiNjk3IDB4ODQ3NDIyYjEgMHhkNTI2MDMyNyAweDExNGM4YzZkIDB4MzllOWU2MmEgMHhkNmE0YzA1ZSAweDFlZjgxNTFhIDB4NjZkZDdmOTYgMHg0ZDllY2ViMiAweDE5YmE3MGVlIC8vIG1ldGhvZCAidmVyaWZ5X2FkZHcodWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybChieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYml0bGVuKGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2JpdGxlbih1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYnNxcnQoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J0b2koYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2J6ZXJvKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9jb25jYXQoYnl0ZVtdLGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Rpdm1vZHcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfZGl2dyh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9lcnIoKXZvaWQiLCBtZXRob2QgInZlcmlmeV9leHAodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHB3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdChieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X2Zyb21fMihieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF91aW50MTYoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X3VpbnQzMihieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3RfdWludDY0KGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZ2V0Yml0X2J5dGVzKGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2dldGJpdF91aW50NjQodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0Ynl0ZShieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2l0b2IodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X211bHcodWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInZlcmlmeV9yZXBsYWNlKGJ5dGVbXSx1aW50NjQsYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NlbGVjdF9ieXRlcyhieXRlW10sYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zZWxlY3RfdWludDY0KHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3NldGJpdF9ieXRlcyhieXRlW10sdWludDY0LGJvb2wpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2V0Yml0X3VpbnQ2NCh1aW50NjQsdWludDY0LGJvb2wpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc2V0Ynl0ZShieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGwodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zaHIodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zcXJ0KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zdWJzdHJpbmcoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfanNvbl9yZWZfc3RyaW5nKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfanNvbl9yZWZfdWludDY0KGJ5dGVbXSxieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfanNvbl9yZWZfb2JqZWN0KGJ5dGVbXSxieXRlW10pYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2FkZHcgdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmQgdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsIHZlcmlmeV9ieXRlc19iaXRsZW4gdmVyaWZ5X3VpbnQ2NF9iaXRsZW4gdmVyaWZ5X2JzcXJ0IHZlcmlmeV9idG9pIHZlcmlmeV9iemVybyB2ZXJpZnlfY29uY2F0IHZlcmlmeV9kaXZtb2R3IHZlcmlmeV9kaXZ3IG1haW5fdmVyaWZ5X2Vycl9yb3V0ZUAxNSB2ZXJpZnlfZXhwIHZlcmlmeV9leHB3IHZlcmlmeV9leHRyYWN0IHZlcmlmeV9leHRyYWN0X2Zyb21fMiB2ZXJpZnlfZXh0cmFjdF91aW50MTYgdmVyaWZ5X2V4dHJhY3RfdWludDMyIHZlcmlmeV9leHRyYWN0X3VpbnQ2NCB2ZXJpZnlfZ2V0Yml0X2J5dGVzIHZlcmlmeV9nZXRiaXRfdWludDY0IHZlcmlmeV9nZXRieXRlIHZlcmlmeV9pdG9iIHZlcmlmeV9tdWx3IHZlcmlmeV9yZXBsYWNlIHZlcmlmeV9zZWxlY3RfYnl0ZXMgdmVyaWZ5X3NlbGVjdF91aW50NjQgdmVyaWZ5X3NldGJpdF9ieXRlcyB2ZXJpZnlfc2V0Yml0X3VpbnQ2NCB2ZXJpZnlfc2V0Ynl0ZSB2ZXJpZnlfc2hsIHZlcmlmeV9zaHIgdmVyaWZ5X3NxcnQgdmVyaWZ5X3N1YnN0cmluZyB2ZXJpZnlfanNvbl9yZWZfc3RyaW5nIHZlcmlmeV9qc29uX3JlZl91aW50NjQgdmVyaWZ5X2pzb25fcmVmX29iamVjdAogICAgZXJyCgptYWluX3ZlcmlmeV9lcnJfcm91dGVAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo2OQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA0NDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9hZGR3W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FkZHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NwogICAgLy8gcmVzdWx0ID0gb3AuYWRkdyhhLCBiKQogICAgYWRkdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTIKICAgIC8vIHJlc3VsdCA9IG9wLmJhc2U2NF9kZWNvZGUob3AuQmFzZTY0LlN0ZEVuY29kaW5nLCBhKQogICAgYmFzZTY0X2RlY29kZSBTdGRFbmNvZGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYmFzZTY0X2RlY29kZV91cmxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmFzZTY0X2RlY29kZV91cmw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNwogICAgLy8gcmVzdWx0ID0gb3AuYmFzZTY0X2RlY29kZShvcC5CYXNlNjQuVVJMRW5jb2RpbmcsIGEpCiAgICBiYXNlNjRfZGVjb2RlIFVSTEVuY29kaW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19iaXRsZW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYml0bGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjIKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfYV9zaXplKSArIGEKICAgIGJ6ZXJvCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyByZXN1bHQgPSBvcC5iaXRsZW4oYSkKICAgIGJpdGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfYml0bGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9iaXRsZW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjI4CiAgICAvLyByZXN1bHQgPSBvcC5iaXRsZW4oYSkKICAgIGJpdGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9ic3FydFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ic3FydDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXN1bHQgPSBvcC5ic3FydChhX2JpZ3VpbnQpCiAgICBic3FydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnRvaVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9idG9pOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MzkKICAgIC8vIHJlc3VsdCA9IG9wLmJ0b2koYSkKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnplcm9bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnplcm86CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXN1bHQgPSBvcC5iemVybyhhKQogICAgYnplcm8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyByZXR1cm4gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfY29uY2F0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2NvbmNhdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0OQogICAgLy8gYSA9IG9wLmJ6ZXJvKHBhZF9hX3NpemUpICsgYQogICAgc3dhcAogICAgYnplcm8KICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1MAogICAgLy8gYiA9IG9wLmJ6ZXJvKHBhZF9iX3NpemUpICsgYgogICAgc3dhcAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1MQogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTIKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Rpdm1vZHdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGl2bW9kdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJlc3VsdCA9IG9wLmRpdm1vZHcoYSwgYiwgYywgZCkKICAgIGRpdm1vZHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZGl2d1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9kaXZ3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo2NAogICAgLy8gcmVzdWx0ID0gb3AuZGl2dyhhLCBiLCBjKQogICAgZGl2dwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHBbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXhwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo3MwogICAgLy8gcmVzdWx0ID0gb3AuZXhwKGEsIGIpCiAgICBleHAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXhwd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leHB3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo3OAogICAgLy8gcmVzdWx0ID0gb3AuZXhwdyhhLCBiKQogICAgZXhwdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjgzCiAgICAvLyByZXN1bHQgPSBvcC5leHRyYWN0KGEsIGIsIGMpCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6ODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF9mcm9tXzJbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdF9mcm9tXzI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyByZXN1bHQgPSBvcC5leHRyYWN0KGEsIDIsIDApCiAgICBleHRyYWN0IDQgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF91aW50MTZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdF91aW50MTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo5MwogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdF91aW50MTYoYSwgYikKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfdWludDMyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfdWludDMyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTgKICAgIC8vIHJlc3VsdCA9IG9wLmV4dHJhY3RfdWludDMyKGEsIGIpCiAgICBleHRyYWN0X3VpbnQzMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leHRyYWN0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdDMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJpdF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRiaXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXN1bHQgPSBvcC5nZXRiaXQoYSwgYikKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTA2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJpdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0Yml0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gcmVzdWx0ID0gb3AuZ2V0Yml0KGEsIGIpCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9nZXRieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldGJ5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTE4CiAgICAvLyByZXN1bHQgPSBvcC5nZXRieXRlKGEsIGIpCiAgICBnZXRieXRlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9pdG9iW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2l0b2I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjMKICAgIC8vIHJlc3VsdCA9IG9wLml0b2IoYSkKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwOAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X211bHdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfbXVsdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gcmVzdWx0ID0gb3AubXVsdyhhLCBiKQogICAgbXVsdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9yZXBsYWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3JlcGxhY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gcmVzdWx0ID0gb3AucmVwbGFjZShhLCBiLCBjKQogICAgcmVwbGFjZTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZWxlY3RfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2VsZWN0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzgKICAgIC8vIHJlc3VsdCA9IG9wLnNlbGVjdF9ieXRlcyhhLCBiLCBjKQogICAgc2VsZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2VsZWN0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZWxlY3RfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQzCiAgICAvLyByZXN1bHQgPSBvcC5zZWxlY3RfdWludDY0KGEsIGIsIGMpCiAgICBzZWxlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJpdF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZXRiaXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQ4CiAgICAvLyByZXN1bHQgPSBvcC5zZXRiaXRfYnl0ZXMoYSwgYiwgYykKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJpdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2V0Yml0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gcmVzdWx0ID0gb3Auc2V0Yml0X3VpbnQ2NChhLCBiLCBjKQogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZXRieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NldGJ5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTU4CiAgICAvLyByZXN1bHQgPSBvcC5zZXRieXRlKGEsIGIsIGMpCiAgICBzZXRieXRlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2hsW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NobDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gcmVzdWx0ID0gb3Auc2hsKGEsIGIpCiAgICBzaGwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3Nocltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zaHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNjgKICAgIC8vIHJlc3VsdCA9IG9wLnNocihhLCBiKQogICAgc2hyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zcXJ0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NxcnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzMKICAgIC8vIHJlc3VsdCA9IG9wLnNxcnQoYSkKICAgIHNxcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3N1YnN0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdWJzdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTc4CiAgICAvLyByZXN1bHQgPSBvcC5zdWJzdHJpbmcoYSwgYiwgYykKICAgIHN1YnN0cmluZzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9qc29uX3JlZl9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfanNvbl9yZWZfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODMKICAgIC8vIHJlc3VsdCA9IG9wLkpzb25SZWYuanNvbl9zdHJpbmcoYSwgYikKICAgIGpzb25fcmVmIEpTT05TdHJpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9qc29uX3JlZl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfanNvbl9yZWZfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODgKICAgIC8vIHJlc3VsdCA9IG9wLkpzb25SZWYuanNvbl91aW50NjQoYSwgYikKICAgIGpzb25fcmVmIEpTT05VaW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX29iamVjdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl9vYmplY3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX29iamVjdChhLCBiKQogICAganNvbl9yZWYgSlNPTk9iamVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyACAQAmAwQVH3x1BhUffHUAIAEAMRtBARMxGRREMRhEgiUERYR+6gT1es61BH1jFzAEobJEQQTNe+GsBHz9pksEVKkQ2QTEZWjeBHpGpq4EBDciCQR+X21yBCTrz4QEnAszlwQK1A2kBJUXiHAE3u3JmwSrIVC7BAKlQBcEPbZrQQRuP/OMBI87nxgEFhZvmgQvRyBlBNWnOcMEYfOz4QRWzzaLBJGf+9IEqui2lwSEdCKxBNUmAycEEUyMbQQ56eYqBNakwF4EHvgVGgRm3X+WBE2ezrIEGbpw7jYaAI4lAAoAHgA0AEoAXwBrAIAAjgCaAMAA5QABAPkBCQEdAToBTgFgAXIBhQGbAa8BwQHTAecCBgIlAjkCVwJsAokCmQKpArUC0gLuAwMAADEZFDEYFBBDNhoBFzYaAhceTBZMFlAoTFCwIkM2GgFXAgBeAUkVFlcGAkxQKExQsCJDNhoBVwIAXgBJFRZXBgJMUChMULAiQzYaAVcCADYaAhevTFCTFihMULAiQzYaAReTFihMULAiQzYaAVcCAJZJFRZXBgJMUChMULAiQzYaAVcCABcWKExQsCJDNhoBF68BKUxQsCJDNhoBVwIANhoCVwIANhoDFzYaBBdMr08DUEyvTwJQUAEpTFCwIkM2GgEXNhoCFzYaAxc2GgQXH08DFk8DFlBPAhZQTBZQKExQsCJDNhoBFzYaAhc2GgMXlxYoTFCwIkM2GgEXNhoCF5QWKExQsCJDNhoBFzYaAheVTBZMFlAoTFCwIkM2GgFXAgA2GgIXNhoDF1hJFRZXBgJMUChMULAiQzYaAVcEAEkVFlcGAkxQKExQsCJDNhoBVwIANhoCF1kWKExQsCJDNhoBVwIANhoCF1oWKExQsCJDNhoBVwIANhoCF4EIWChMULAiQzYaAVcCADYaAhdTKiNPAlQoTFCwIkM2GgEXNhoCF1MqI08CVChMULAiQzYaAVcCADYaAhdVFihMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaARc2GgIXHUwWTBZQKExQsCJDNhoBVwIANhoCFzYaA1cCAF1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCADYaAxdNSRUWVwYCTFAoTFCwIkM2GgEXNhoCFzYaAxdNFihMULAiQzYaAVcCADYaAhc2GgMjU1RJFRZXBgJMUChMULAiQzYaARc2GgIXNhoDI1NUFihMULAiQzYaAVcCADYaAhc2GgMXVkkVFlcGAkxQKExQsCJDNhoBFzYaAheQFihMULAiQzYaARc2GgIXkRYoTFCwIkM2GgEXkhYoTFCwIkM2GgFXAgA2GgIXNhoDF1JJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAF8ASRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgBfARYoTFCwIkM2GgFXAgA2GgJXAgBfAkkVFlcGAkxQKExQsCJD", + "approval": "CyACAQAmAwQVH3x1BhUffHUAIAEAMRtBARMxGRREMRhEgiUERYR+6gT1es61BH1jFzAEobJEQQTNe+GsBHz9pksEVKkQ2QTEZWjeBHpGpq4EBDciCQR+X21yBCTrz4QEnAszlwQK1A2kBJUXiHAE3u3JmwSrIVC7BAKlQBcEPbZrQQRuP/OMBI87nxgEFhZvmgQvRyBlBNWnOcMEYfOz4QRWzzaLBJGf+9IEqui2lwSEdCKxBNUmAycEEUyMbQQ56eYqBNakwF4EHvgVGgRm3X+WBE2ezrIEGbpw7jYaAI4lAAwAIAA2AEwAYQBtAIIAkACcAMIA5wABAPsBCwEfATwBUAFiAXQBhwGdAbEBwwHVAekCCAInAjsCWQJuAosCmwKrArcC1ALwAwUAADEZFDEYFBBEIkM2GgEXNhoCFx5MFkwWUChMULAiQzYaAVcCAF4BSRUWVwYCTFAoTFCwIkM2GgFXAgBeAEkVFlcGAkxQKExQsCJDNhoBVwIANhoCF69MUJMWKExQsCJDNhoBF5MWKExQsCJDNhoBVwIAlkkVFlcGAkxQKExQsCJDNhoBVwIAFxYoTFCwIkM2GgEXrwEpTFCwIkM2GgFXAgA2GgJXAgA2GgMXNhoEF0yvTwNQTK9PAlBQASlMULAiQzYaARc2GgIXNhoDFzYaBBcfTwMWTwMWUE8CFlBMFlAoTFCwIkM2GgEXNhoCFzYaAxeXFihMULAiQzYaARc2GgIXlBYoTFCwIkM2GgEXNhoCF5VMFkwWUChMULAiQzYaAVcCADYaAhc2GgMXWEkVFlcGAkxQKExQsCJDNhoBVwQASRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXWRYoTFCwIkM2GgFXAgA2GgIXWhYoTFCwIkM2GgFXAgA2GgIXgQhYKExQsCJDNhoBVwIANhoCF1MqI08CVChMULAiQzYaARc2GgIXUyojTwJUKExQsCJDNhoBVwIANhoCF1UWKExQsCJDNhoBFxaABhUffHUACExQsCJDNhoBFzYaAhcdTBZMFlAoTFCwIkM2GgFXAgA2GgIXNhoDVwIAXUkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIANhoDF01JFRZXBgJMUChMULAiQzYaARc2GgIXNhoDF00WKExQsCJDNhoBVwIANhoCFzYaAyNTVEkVFlcGAkxQKExQsCJDNhoBFzYaAhc2GgMjU1QWKExQsCJDNhoBVwIANhoCFzYaAxdWSRUWVwYCTFAoTFCwIkM2GgEXNhoCF5AWKExQsCJDNhoBFzYaAheRFihMULAiQzYaAReSFihMULAiQzYaAVcCADYaAhc2GgMXUkkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAXwBJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAF8BFihMULAiQzYaAVcCADYaAlcCAF8CSRUWVwYCTFAoTFCwIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal index d8cc640..e54acc1 100644 --- a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal +++ b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal @@ -25,7 +25,9 @@ main___algopy_default_create@67: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.PrimitiveOps.contract.PrimitiveOpsContract.verify_uint64_init[routing]() -> void: diff --git a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json index 2c7473b..70a0524 100644 --- a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json +++ b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json @@ -1596,19 +1596,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwICItIiAweDE1MWY3Yzc1MDAyMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANjcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NzI1YzY5MmIgMHgxNzMxNDU1OSAweDUzZjM0ODkzIDB4ODhjOGIyNjkgMHhhNDY0YjdhYiAweDljOGIxMWI4IDB4NmY0MDY1NGUgMHhlYzlhMjk3NCAweGM3OTM3MDhmIDB4N2RkYjc0OTkgMHhhMjFjNDQzZCAweDZlN2ZiMjEyIDB4YjAwN2ZjYjAgMHgyZWJjMjBkNCAweGIwOTU0YjY2IDB4ZGQxNDBhZWYgMHhhY2U0NzRkYSAweGJhNjk0OTkwIDB4NmRiNTgxYzAgMHg5MWM4ZGI4OSAweGRiZTc3MTU4IDB4OWEwZjIyZTEgMHg2NDAzM2QzNyAweDJhNzIzN2M1IDB4ZTNhOTQ0NTggMHg0MmY4N2Y3ZCAweDJiNTU0MmE0IDB4OWJlMmZiZTkgMHgxY2Q5MjUxNSAweDY0ZTE3MDVjIDB4ZjEyNzFjNTAgMHgyYWI2M2I3MCAweDgzNGJiN2QyIDB4NTMxNjIwZDcgMHgzZmI5ZTc2OSAweGZhOGRiMGJjIDB4YTcyZWE0ODUgMHhiN2IwYmExOSAweDc0NDYwYzQyIDB4YWIzMjA3MzggMHg1MmFkNDY1NCAweDEwMTU2Mzk5IDB4MGYwNzU5NTcgMHhiZDg0M2RmZiAweGIzNzdkMzgxIDB4ODk3NjcyNjUgMHg0NTZiNGIyMyAweDMzZDFiODhjIDB4NmJmOTczZWEgMHg2N2NkNmJiMiAweDNmNTg4MDVhIDB4MWUxMzAwMzkgMHg1MDlkYzkxZCAweGE1NjRhMjAyIDB4MjM2NTA3NjMgMHhmOGM4ZjhkNSAweDIzZmFmN2E0IDB4N2QwYWZlMTUgMHg0ODU4MWFkZiAweGUwMDdjMTBiIC8vIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9pbml0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfYWRkKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3N1Yih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9tdWwodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZGl2KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X21vZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9hbmQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfb3IodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfeG9yKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X25vdCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2xzaGlmdCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9yc2hpZnQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfcG93KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2VxKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9uZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbHQodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2xlKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9ndCh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZ2UodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfaW5pdCh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYWRkKGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9ieXRlc19uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9ieXRlc19hbmQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19vcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX3hvcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX25vdChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYWRkKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hZGRfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9zdWIoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X211bChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZGl2KGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9kaXZfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tb2QoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X21vZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FuZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfb3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfeG9yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF94b3JfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X25lKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbmVfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sdF91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2d0KGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ3RfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9nZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2luaXQoc3RyaW5nKXN0cmluZyIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoKHN0cmluZyxzdHJpbmcpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19lbmRzd2l0aChzdHJpbmcsc3RyaW5nKWJvb2wiLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfam9pbihzdHJpbmcsc3RyaW5nKXN0cmluZyIsIG1ldGhvZCAidmVyaWZ5X2xvZyhzdHJpbmcsdWludDY0LGJ5dGVbXSxieXRlW10sYm9vbCxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYnl0ZVtdLGJ5dGVbXSxieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV91aW50NjRfaW5pdCB2ZXJpZnlfdWludDY0X2FkZCB2ZXJpZnlfdWludDY0X3N1YiB2ZXJpZnlfdWludDY0X211bCB2ZXJpZnlfdWludDY0X2RpdiB2ZXJpZnlfdWludDY0X21vZCB2ZXJpZnlfdWludDY0X2FuZCB2ZXJpZnlfdWludDY0X29yIHZlcmlmeV91aW50NjRfeG9yIHZlcmlmeV91aW50NjRfbm90IHZlcmlmeV91aW50NjRfbHNoaWZ0IHZlcmlmeV91aW50NjRfcnNoaWZ0IHZlcmlmeV91aW50NjRfcG93IHZlcmlmeV91aW50NjRfZXEgdmVyaWZ5X3VpbnQ2NF9uZSB2ZXJpZnlfdWludDY0X2x0IHZlcmlmeV91aW50NjRfbGUgdmVyaWZ5X3VpbnQ2NF9ndCB2ZXJpZnlfdWludDY0X2dlIHZlcmlmeV9ieXRlc19pbml0IHZlcmlmeV9ieXRlc19hZGQgdmVyaWZ5X2J5dGVzX2VxIHZlcmlmeV9ieXRlc19uZSB2ZXJpZnlfYnl0ZXNfYW5kIHZlcmlmeV9ieXRlc19vciB2ZXJpZnlfYnl0ZXNfeG9yIHZlcmlmeV9ieXRlc19ub3QgdmVyaWZ5X2JpZ3VpbnRfYWRkIHZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfc3ViIHZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbXVsIHZlcmlmeV9iaWd1aW50X211bF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZGl2IHZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbW9kIHZlcmlmeV9iaWd1aW50X21vZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfYW5kIHZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfb3IgdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0IHZlcmlmeV9iaWd1aW50X3hvciB2ZXJpZnlfYmlndWludF94b3JfdWludDY0IHZlcmlmeV9iaWd1aW50X2VxIHZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9uZSB2ZXJpZnlfYmlndWludF9uZV91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbHQgdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0IHZlcmlmeV9iaWd1aW50X2xlIHZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9ndCB2ZXJpZnlfYmlndWludF9ndF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZ2UgdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0IHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGggdmVyaWZ5X3N0cmluZ19lbmRzd2l0aCB2ZXJpZnlfc3RyaW5nX2pvaW4gdmVyaWZ5X2xvZwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDY3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5CiAgICAvLyByZXN1bHQgPSBvcC5idG9pKHJhd192YWx1ZSkKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfYWRkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9hZGQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNAogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X3N1Yltyb3V0aW5nXSgpIC0+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+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" }, "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/r3pAR9Cv4VBEhYGt8E4AfBCzYaAI48AAsAGQApADkASQBZAGkAeQCJAJkApQC1AMUA1QDpAP0BEQElATkBTQFfAYUBnQG1AdAB6wIGAhsCNgJQAmsChQKgAroC1QLvAwoDJAM/A1kDdAOOA6kDwwPbA/IECgQhBDkEUARoBH8ElwSuBMYE3QT8BS0FaAWKADEZFDEYFBBEIkM2GgFXAgAXFihMULAiQzYaARc2GgIXCBYoTFCwIkM2GgEXNhoCFwkWKExQsCJDNhoBFzYaAhcLFihMULAiQzYaARc2GgIXChYoTFCwIkM2GgEXNhoCFxgWKExQsCJDNhoBFzYaAhcaFihMULAiQzYaARc2GgIXGRYoTFCwIkM2GgEXNhoCFxsWKExQsCJDNhoBFxwWKExQsCJDNhoBFzYaAheQFihMULAiQzYaARc2GgIXkRYoTFCwIkM2GgEXNhoCF5QWKExQsCJDNhoBFzYaAhcSKSNPAlQoTFCwIkM2GgEXNhoCFxMpI08CVChMULAiQzYaARc2GgIXDCkjTwJUKExQsCJDNhoBFzYaAhcOKSNPAlQoTFCwIkM2GgEXNhoCFw0pI08CVChMULAiQzYaARc2GgIXDykjTwJUKExQsCJDNhoBFxaABhUffHUACExQsCJDNhoBVwIANhoCVwIANhoDFzYaBBdMr08DUEyvTwJQUAErTFCwIkM2GgFXAgA2GgJXAgASKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgATKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCsSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCrSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCtSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXr0xQrgErTFCwIkM2GgFXAgA2GgJXAgCgSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqBJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKFJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWoUkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAo0kVFlcGAkxQKExQsCJDNhoBVwIANhoCFxajSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCiSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqJJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKpJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWqkkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIArEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxasSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCrSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqtJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAK1JFRZXBgJMUChMULAiQzYaAVcCADYaAhcWrUkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAqCkjTwJUKExQsCJDNhoBVwIANhoCFxaoKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCpKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqkpI08CVChMULAiQzYaAVcCADYaAlcCAKQpI08CVChMULAiQzYaAVcCADYaAhcWpCkjTwJUKExQsCJDNhoBVwIANhoCVwIApikjTwJUKExQsCJDNhoBVwIANhoCFxamKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgClKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqUpI08CVChMULAiQzYaAVcCADYaAlcCAKcpI08CVChMULAiQzYaAVcCADYaAhcWpykjTwJUKExQsCJDNhoBVwIAgAdIZWxsbywgTFBJFRZXBgJMUChMULAiQzYaAVcCAEk2GgJXAgBJTgIVSU8CFQ1BAAwjKSNPAlQoTFCwIkNLAiNLAlhLAhJC/+k2GgFXAgBJNhoCVwIASU4CFUlPAhVJTgINQQAMIykjTwJUKExQsCJDSUsCSU4CCUsFTE8CWEsDEkL/4jYaAVcCADYaAlcCAEyAAiwgUExQSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXNhoDVwIANhoEVwIANhoFNhoGNhoHNhoINhoJNhoKNhoLVwIANhoMVwIANhoNVwIATwwqUE8MFlAqUE8LUCpQTwpQKlBPCVAqUE8IUCpQTwdQKlBPBlAqUE8FUCpQTwRQKlBPA1AqUE8CUCpQTFCwIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/StateMutations/data/StateMutations.approval.teal b/tests/artifacts/StateMutations/data/StateMutations.approval.teal index fe2c61e..be0a1cf 100644 --- a/tests/artifacts/StateMutations/data/StateMutations.approval.teal +++ b/tests/artifacts/StateMutations/data/StateMutations.approval.teal @@ -98,7 +98,9 @@ main_opt_in@14: main___algopy_default_create@13: txn ApplicationID ! - return // on error: can only call when creating + assert // can only call when creating + intc_1 // 1 + return // _puya_lib.arc4.dynamic_array_concat_dynamic_element(array_items_count: uint64, array_head_and_tail: bytes, new_items_count: uint64, new_head_and_tail: bytes) -> bytes: @@ -438,7 +440,7 @@ modify: extract 2 0 dig 1 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dig 1 intc_0 // 0 extract_uint16 @@ -486,7 +488,7 @@ modify: extract 2 0 dig 1 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dig 1 intc_0 // 0 extract_uint16 @@ -532,7 +534,7 @@ modify: extract 2 0 dig 1 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dig 1 intc_0 // 0 extract_uint16 @@ -580,7 +582,7 @@ modify: extract 2 0 dig 1 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dig 1 intc_0 // 0 extract_uint16 @@ -625,7 +627,7 @@ modify: extract 2 0 dig 1 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dig 1 intc_0 // 0 extract_uint16 @@ -676,7 +678,7 @@ modify: extract 2 0 dig 1 intc_0 // 0 - extract_uint16 + extract_uint16 // on error: invalid array length header dig 1 intc_0 // 0 extract_uint16 diff --git a/tests/artifacts/StateMutations/data/StateMutations.arc56.json b/tests/artifacts/StateMutations/data/StateMutations.arc56.json index c155f64..f718795 100644 --- a/tests/artifacts/StateMutations/data/StateMutations.arc56.json +++ b/tests/artifacts/StateMutations/data/StateMutations.arc56.json @@ -143,98 +143,109 @@ }, { "pc": [ - 526, - 795, - 931 + 528, + 797, + 933 ], "errorMessage": "check self.box exists" }, { "pc": [ - 481, - 684, - 921 + 483, + 686, + 923 ], "errorMessage": "check self.glob exists" }, { "pc": [ - 440, - 577, - 916 + 442, + 579, + 918 ], "errorMessage": "check self.glob_assign exists" }, { "pc": [ - 506, - 742, - 928 + 508, + 744, + 930 ], "errorMessage": "check self.loc exists for account" }, { "pc": [ - 553, - 855, - 938 + 555, + 857, + 940 ], "errorMessage": "check self.map entry exists" }, { "pc": [ - 460, - 630, - 912 + 462, + 632, + 914 ], "errorMessage": "check self.no_proxy exists" }, { "pc": [ - 962 + 964 ], "errorMessage": "expected box == no_proxy" }, { "pc": [ - 950 + 952 ], "errorMessage": "expected global == no_proxy" }, { "pc": [ - 944 + 946 ], "errorMessage": "expected global assign == no_proxy" }, { "pc": [ - 956 + 958 ], "errorMessage": "expected local == no_proxy" }, { "pc": [ - 966 + 968 ], "errorMessage": "expected map == no_proxy" }, { "pc": [ - 593, - 619, - 646, - 672, - 700, - 726, - 758, - 784, - 811, - 837, - 871, - 897 + 595, + 621, + 648, + 674, + 702, + 728, + 760, + 786, + 813, + 839, + 873, + 899 ], "errorMessage": "index access is out of bounds" + }, + { + "pc": [ + 587, + 640, + 694, + 752, + 805, + 865 + ], + "errorMessage": "invalid array length header" } ], "pcOffsetMethod": "none" @@ -245,19 +256,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrICJib3giICJub19wcm94eSIgMHgwMDAwICJnbG9iX2Fzc2lnbiIgImdsb2IiICJsb2MiIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YSAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0ICJtYXAiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MjQKICAgIC8vIHNlbGYubm9fcHJveHkgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg1MjZlOGJiZiAweDk1ZmVmMTNkIDB4MGMyOTQ0NGIgLy8gbWV0aG9kICJhcHBlbmQoKXZvaWQiLCBtZXRob2QgIm1vZGlmeSgpdm9pZCIsIG1ldGhvZCAiZ2V0KCkodWludDY0LHN0cmluZylbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGFwcGVuZCBtb2RpZnkgZ2V0CiAgICBlcnIKCm1haW5fYmFyZV9yb3V0aW5nQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjIyCiAgICAvLyBjbGFzcyBTdGF0ZU11dGF0aW9ucyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTMgbWFpbl9vcHRfaW5AMTQKICAgIGVycgoKbWFpbl9vcHRfaW5AMTQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzEKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNAogICAgLy8gc2VsZi5nbG9iLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM0CiAgICAvLyBzZWxmLmdsb2IudmFsdWUgPSBNeUFycmF5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzUKICAgIC8vIHNlbGYuYm94LnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNQogICAgLy8gc2VsZi5ib3gudmFsdWUgPSBNeUFycmF5KCkKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNgogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNgogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNwogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGJ5dGVjIDggLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNwogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTM6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAyCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA1CiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgNAogICAgLQogICAgY292ZXIgNgogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGNvdmVyIDYKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA1CiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgc3dhcAoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMgogICAgc3dhcAogICAgcmVwbGFjZTMKICAgIGZyYW1lX2J1cnkgMwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNQogICAgYiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5hcHBlbmRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDIKICAgIC8vIGFyciA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDMKICAgIC8vIGFyci5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGJ5dGVjIDYgLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ1CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ4CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OAogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ5CiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OQogICAgLy8gc2VsZi5ib3gudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTAKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVNdXRhdGlvbnMuc3RhdGVtdXRhdGlvbnMuU3RhdGVNdXRhdGlvbnMubW9kaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKbW9kaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU2CiAgICAvLyBhcnIgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU3CiAgICAvLyBhcnJbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTcKICAgIC8vIGFyclswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1OAogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IGFyci5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MAogICAgLy8gc2VsZi5ub19wcm94eVswXS5iYXogPSBtb2RpZmllZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MAogICAgLy8gc2VsZi5ub19wcm94eVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYyCiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIHN3YXAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MwogICAgLy8gc2VsZi5ib3gudmFsdWVbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjMKICAgIC8vIHNlbGYuYm94LnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjQKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICBieXRlYyA4IC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2NAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjgKICAgIC8vIGEwID0gc2VsZi5ub19wcm94eS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub19wcm94eSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2OQogICAgLy8gYTEgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcwCiAgICAvLyBhMiA9IHNlbGYuZ2xvYi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzEKICAgIC8vIGEzID0gc2VsZi5sb2NbVHhuLnNlbmRlcl0uY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcyCiAgICAvLyBhNCA9IHNlbGYuYm94LnZhbHVlLmNvcHkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjczCiAgICAvLyBhNSA9IHNlbGYubWFwW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzUKICAgIC8vIGFzc2VydCBhMCA9PSBhMSwgImV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkiCiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NgogICAgLy8gYXNzZXJ0IGEwID09IGEyLCAiZXhwZWN0ZWQgZ2xvYmFsID09IG5vX3Byb3h5IgogICAgZGlnIDQKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NwogICAgLy8gYXNzZXJ0IGEwID09IGEzLCAiZXhwZWN0ZWQgbG9jYWwgPT0gbm9fcHJveHkiCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvY2FsID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzgKICAgIC8vIGFzc2VydCBhMCA9PSBhNCwgImV4cGVjdGVkIGJveCA9PSBub19wcm94eSIKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYm94ID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzkKICAgIC8vIGFzc2VydCBhMCA9PSBhNSwgImV4cGVjdGVkIG1hcCA9PSBub19wcm94eSIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG1hcCA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrICJib3giICJub19wcm94eSIgMHgwMDAwICJnbG9iX2Fzc2lnbiIgImdsb2IiICJsb2MiIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YSAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0ICJtYXAiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MjQKICAgIC8vIHNlbGYubm9fcHJveHkgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg1MjZlOGJiZiAweDk1ZmVmMTNkIDB4MGMyOTQ0NGIgLy8gbWV0aG9kICJhcHBlbmQoKXZvaWQiLCBtZXRob2QgIm1vZGlmeSgpdm9pZCIsIG1ldGhvZCAiZ2V0KCkodWludDY0LHN0cmluZylbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGFwcGVuZCBtb2RpZnkgZ2V0CiAgICBlcnIKCm1haW5fYmFyZV9yb3V0aW5nQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjIyCiAgICAvLyBjbGFzcyBTdGF0ZU11dGF0aW9ucyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTMgbWFpbl9vcHRfaW5AMTQKICAgIGVycgoKbWFpbl9vcHRfaW5AMTQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzEKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNAogICAgLy8gc2VsZi5nbG9iLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM0CiAgICAvLyBzZWxmLmdsb2IudmFsdWUgPSBNeUFycmF5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzUKICAgIC8vIHNlbGYuYm94LnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNQogICAgLy8gc2VsZi5ib3gudmFsdWUgPSBNeUFycmF5KCkKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNgogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNgogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNwogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGJ5dGVjIDggLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNwogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTM6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChzb3VyY2U6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIHN1YnN0cmluZyAwIDIKICAgIGR1cAogICAgYnRvaQogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDIKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDUKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkdXAKICAgIGRpZyA0CiAgICAtCiAgICBjb3ZlciA2CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgY292ZXIgNgogICAgZGlnIDQKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDUKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAyCiAgICBzd2FwCiAgICByZXBsYWNlMwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA1CiAgICBiIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlTXV0YXRpb25zLnN0YXRlbXV0YXRpb25zLlN0YXRlTXV0YXRpb25zLmFwcGVuZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MgogICAgLy8gYXJyID0gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iX2Fzc2lnbiBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDUKICAgIC8vIHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUgPSBhcnIuY29weSgpCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDYKICAgIC8vIHNlbGYubm9fcHJveHkuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAibm9fcHJveHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9fcHJveHkgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDMKICAgIC8vIGFyci5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjIDYgLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDYKICAgIC8vIHNlbGYubm9fcHJveHkuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMSAvLyAibm9fcHJveHkiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ3CiAgICAvLyBzZWxmLmdsb2IudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ3CiAgICAvLyBzZWxmLmdsb2IudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDgKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgdHhuIFNlbmRlcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ4CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBzd2FwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDkKICAgIC8vIHNlbGYuYm94LnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ5CiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA4IC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjUwCiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5tb2RpZnlbcm91dGluZ10oKSAtPiB2b2lkOgptb2RpZnk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTYKICAgIC8vIGFyciA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTcKICAgIC8vIGFyclswXS5iYXogPSBtb2RpZmllZAogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU3CiAgICAvLyBhcnJbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTgKICAgIC8vIHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUgPSBhcnIuY29weSgpCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjAKICAgIC8vIHNlbGYubm9fcHJveHlbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub19wcm94eSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MAogICAgLy8gc2VsZi5ub19wcm94eVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYxCiAgICAvLyBzZWxmLmdsb2IudmFsdWVbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MgogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MgogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBzd2FwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjMKICAgIC8vIHNlbGYuYm94LnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3ggZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjMKICAgIC8vIHNlbGYuYm94LnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjQKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICBieXRlYyA4IC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY0CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlTXV0YXRpb25zLnN0YXRlbXV0YXRpb25zLlN0YXRlTXV0YXRpb25zLmdldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2OAogICAgLy8gYTAgPSBzZWxmLm5vX3Byb3h5LmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY5CiAgICAvLyBhMSA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzAKICAgIC8vIGEyID0gc2VsZi5nbG9iLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3MQogICAgLy8gYTMgPSBzZWxmLmxvY1tUeG4uc2VuZGVyXS5jb3B5KCkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzIKICAgIC8vIGE0ID0gc2VsZi5ib3gudmFsdWUuY29weSgpCiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3ggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzMKICAgIC8vIGE1ID0gc2VsZi5tYXBbVHhuLnNlbmRlcl0uY29weSgpCiAgICBieXRlYyA4IC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NQogICAgLy8gYXNzZXJ0IGEwID09IGExLCAiZXhwZWN0ZWQgZ2xvYmFsIGFzc2lnbiA9PSBub19wcm94eSIKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZ2xvYmFsIGFzc2lnbiA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5Ojc2CiAgICAvLyBhc3NlcnQgYTAgPT0gYTIsICJleHBlY3RlZCBnbG9iYWwgPT0gbm9fcHJveHkiCiAgICBkaWcgNAogICAgdW5jb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGdsb2JhbCA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5Ojc3CiAgICAvLyBhc3NlcnQgYTAgPT0gYTMsICJleHBlY3RlZCBsb2NhbCA9PSBub19wcm94eSIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbG9jYWwgPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3OAogICAgLy8gYXNzZXJ0IGEwID09IGE0LCAiZXhwZWN0ZWQgYm94ID09IG5vX3Byb3h5IgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBib3ggPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3OQogICAgLy8gYXNzZXJ0IGEwID09IGE1LCAiZXhwZWN0ZWQgbWFwID09IG5vX3Byb3h5IgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbWFwID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "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", + "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=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal b/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal index b19f4ae..2e4e24c 100644 --- a/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal +++ b/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal @@ -124,7 +124,9 @@ main___algopy_default_create@39: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.StateOps.contract.GlobalStateContract.get_implicit_key_arc4_uint[routing]() -> void: diff --git a/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json b/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json index f6a0f32..892b0c2 100644 --- a/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json +++ b/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json @@ -684,91 +684,91 @@ }, { "pc": [ - 906 + 908 ], "errorMessage": "check self.arc4_address exists" }, { "pc": [ - 895 + 897 ], "errorMessage": "check self.arc4_bool exists" }, { "pc": [ - 884 + 886 ], "errorMessage": "check self.arc4_byte exists" }, { "pc": [ - 928 + 930 ], "errorMessage": "check self.arc4_dynamic_bytes exists" }, { "pc": [ - 873 + 875 ], "errorMessage": "check self.arc4_string exists" }, { "pc": [ - 862 + 864 ], "errorMessage": "check self.arc4_uint exists" }, { "pc": [ - 917 + 919 ], "errorMessage": "check self.arc4_uint128 exists" }, { "pc": [ - 818 + 820 ], "errorMessage": "check self.implicit_key_arc4_address exists" }, { "pc": [ - 807 + 809 ], "errorMessage": "check self.implicit_key_arc4_bool exists" }, { "pc": [ - 796 + 798 ], "errorMessage": "check self.implicit_key_arc4_byte exists" }, { "pc": [ - 840 + 842 ], "errorMessage": "check self.implicit_key_arc4_dynamic_bytes exists" }, { "pc": [ - 786 + 788 ], "errorMessage": "check self.implicit_key_arc4_string exists" }, { "pc": [ - 776 + 778 ], "errorMessage": "check self.implicit_key_arc4_uint exists" }, { "pc": [ - 829 + 831 ], "errorMessage": "check self.implicit_key_arc4_uint128 exists" }, { "pc": [ - 851 + 853 ], "errorMessage": "check self.implicit_key_tuple exists" } @@ -781,19 +781,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAiaW1wbGljaXRfa2V5X3R1cGxlIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIgImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE1LTUxNgogICAgLy8gIyBJbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQ2NCgxMzM3KSkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlYyAxNiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpKQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgMTcgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSA9IEdsb2JhbFN0YXRlKGFyYzQuQnl0ZSgwKSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCA9IEdsb2JhbFN0YXRlKGFyYzQuQm9vbChUcnVlKSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyA9IEdsb2JhbFN0YXRlKGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKSkKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyAxOCAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzID0gR2xvYmFsU3RhdGUoYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZSA9IEdsb2JhbFN0YXRlKChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjUtNTI2CiAgICAvLyAjIEV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIHNlbGYuYXJjNF91aW50ID0gR2xvYmFsU3RhdGUoYXJjNC5VSW50NjQoMTMzNyksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfdWludCIpCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIpCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjgKICAgIC8vIHNlbGYuYXJjNF9ieXRlID0gR2xvYmFsU3RhdGUoYXJjNC5CeXRlKDApLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiKQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjkKICAgIC8vIHNlbGYuYXJjNF9ib29sID0gR2xvYmFsU3RhdGUoYXJjNC5Cb29sKFRydWUpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiKQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSkpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyOQogICAgLy8gc2VsZi5hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMC01MzIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IikKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgMTggLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzUKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpKQogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzQtNTM2CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEzCiAgICAvLyBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgxY2M5NjZlZSAweDIzNjdjZDRiIDB4NjkxMjhlOTAgMHg2OGQ1OTBlMiAweDQ0ZWYwNjgxIDB4MWNkMjk0ZWMgMHhhYWM4ZWNiMSAweDE2NmM2YWZkIDB4M2NjM2JiN2IgMHg5YTY5NDZhZCAweGRlZDc1MDMzIDB4NjYyNzllOTMgMHgwOTZlOTI3YiAweDk3NTMxZmJjIDB4NmVhM2Y5OTYgMHhhN2Y0ZjQwMiAweGFhZGRjYzRjIDB4NWVjMzExNmQgMHgyMGY1NmVlZSAweDFjMTQ5YTQzIDB4YTU3NWFjN2QgMHg4N2YwODY5YiAweDQ2MWFmYzZkIDB4MDQ4MTE2ZWEgMHgzMGUzNGE5MyAweGQyZTY0NmVmIDB4ZTY3NGEyNzAgMHhhODdlNTQwZCAweDcyMGEzY2EwIDB4MjU3NzA4ZjcgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCgpdWludDY0IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nKClzdHJpbmciLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKClieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4KCl1aW50MTI4IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcygpYnl0ZVtdIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X3R1cGxlKCkodWludDY0LGJ5dGVbXSxib29sKSIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludCgpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHJpbmcoKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludDEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2FyYzRfZHluYW1pY19ieXRlcygpYnl0ZVtdIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyhzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoYnl0ZSl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbChib29sKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgodWludDEyOCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV90dXBsZSgodWludDY0LGJ5dGVbXSxib29sKSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9zdHJpbmcoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2J5dGUoYnl0ZSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ib29sKGJvb2wpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X3VpbnQxMjgodWludDEyOCl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9keW5hbWljX2J5dGVzKGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBnZXRfaW1wbGljaXRfa2V5X3R1cGxlIGdldF9hcmM0X3VpbnQgZ2V0X2FyYzRfc3RyaW5nIGdldF9hcmM0X2J5dGUgZ2V0X2FyYzRfYm9vbCBnZXRfYXJjNF9hZGRyZXNzIGdldF9hcmM0X3VpbnQxMjggZ2V0X2FyYzRfZHluYW1pY19ieXRlcyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIHNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IHNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIHNldF9pbXBsaWNpdF9rZXlfdHVwbGUgc2V0X2FyYzRfdWludCBzZXRfYXJjNF9zdHJpbmcgc2V0X2FyYzRfYnl0ZSBzZXRfYXJjNF9ib29sIHNldF9hcmM0X2FkZHJlc3Mgc2V0X2FyYzRfdWludDEyOCBzZXRfYXJjNF9keW5hbWljX2J5dGVzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0MQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzgtNTM5CiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0NQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTUzCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1NwogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjEKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY1CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV90dXBsZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU3NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTcxLTU3MgogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc4CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3N0cmluZy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9zdHJpbmcgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MgogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ieXRlLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODYKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYm9vbCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkwCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2FkZHJlc3MgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50MTI4LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTgKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMC02MDEKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjAzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDAtNjAxCiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA0IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDAKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQwCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAiaW1wbGljaXRfa2V5X3R1cGxlIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIgImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE1LTUxNgogICAgLy8gIyBJbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQ2NCgxMzM3KSkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlYyAxNiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpKQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgMTcgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSA9IEdsb2JhbFN0YXRlKGFyYzQuQnl0ZSgwKSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCA9IEdsb2JhbFN0YXRlKGFyYzQuQm9vbChUcnVlKSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyA9IEdsb2JhbFN0YXRlKGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKSkKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyAxOCAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzID0gR2xvYmFsU3RhdGUoYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZSA9IEdsb2JhbFN0YXRlKChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjUtNTI2CiAgICAvLyAjIEV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIHNlbGYuYXJjNF91aW50ID0gR2xvYmFsU3RhdGUoYXJjNC5VSW50NjQoMTMzNyksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfdWludCIpCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIpCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjgKICAgIC8vIHNlbGYuYXJjNF9ieXRlID0gR2xvYmFsU3RhdGUoYXJjNC5CeXRlKDApLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiKQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjkKICAgIC8vIHNlbGYuYXJjNF9ib29sID0gR2xvYmFsU3RhdGUoYXJjNC5Cb29sKFRydWUpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiKQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSkpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyOQogICAgLy8gc2VsZi5hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMC01MzIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IikKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgMTggLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzUKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpKQogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzQtNTM2CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEzCiAgICAvLyBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgxY2M5NjZlZSAweDIzNjdjZDRiIDB4NjkxMjhlOTAgMHg2OGQ1OTBlMiAweDQ0ZWYwNjgxIDB4MWNkMjk0ZWMgMHhhYWM4ZWNiMSAweDE2NmM2YWZkIDB4M2NjM2JiN2IgMHg5YTY5NDZhZCAweGRlZDc1MDMzIDB4NjYyNzllOTMgMHgwOTZlOTI3YiAweDk3NTMxZmJjIDB4NmVhM2Y5OTYgMHhhN2Y0ZjQwMiAweGFhZGRjYzRjIDB4NWVjMzExNmQgMHgyMGY1NmVlZSAweDFjMTQ5YTQzIDB4YTU3NWFjN2QgMHg4N2YwODY5YiAweDQ2MWFmYzZkIDB4MDQ4MTE2ZWEgMHgzMGUzNGE5MyAweGQyZTY0NmVmIDB4ZTY3NGEyNzAgMHhhODdlNTQwZCAweDcyMGEzY2EwIDB4MjU3NzA4ZjcgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCgpdWludDY0IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nKClzdHJpbmciLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKClieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4KCl1aW50MTI4IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcygpYnl0ZVtdIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X3R1cGxlKCkodWludDY0LGJ5dGVbXSxib29sKSIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludCgpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHJpbmcoKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludDEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2FyYzRfZHluYW1pY19ieXRlcygpYnl0ZVtdIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyhzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoYnl0ZSl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbChib29sKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgodWludDEyOCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV90dXBsZSgodWludDY0LGJ5dGVbXSxib29sKSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9zdHJpbmcoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2J5dGUoYnl0ZSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ib29sKGJvb2wpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X3VpbnQxMjgodWludDEyOCl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9keW5hbWljX2J5dGVzKGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBnZXRfaW1wbGljaXRfa2V5X3R1cGxlIGdldF9hcmM0X3VpbnQgZ2V0X2FyYzRfc3RyaW5nIGdldF9hcmM0X2J5dGUgZ2V0X2FyYzRfYm9vbCBnZXRfYXJjNF9hZGRyZXNzIGdldF9hcmM0X3VpbnQxMjggZ2V0X2FyYzRfZHluYW1pY19ieXRlcyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIHNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IHNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIHNldF9pbXBsaWNpdF9rZXlfdHVwbGUgc2V0X2FyYzRfdWludCBzZXRfYXJjNF9zdHJpbmcgc2V0X2FyYzRfYnl0ZSBzZXRfYXJjNF9ib29sIHNldF9hcmM0X2FkZHJlc3Mgc2V0X2FyYzRfdWludDEyOCBzZXRfYXJjNF9keW5hbWljX2J5dGVzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQxCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzOC01MzkKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQ1CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18yIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0OQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTMKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTU3CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2MQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjUKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2OQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV90dXBsZSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc0CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnQudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfdWludCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NzEtNTcyCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NzgKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfc3RyaW5nLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3N0cmluZyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYnl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgyCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2J5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2J5dGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4NgogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ib29sLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ib29sIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTAKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYWRkcmVzcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfdWludDEyOFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTk0CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQxMjggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5OAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50LnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjAwLTYwMQogICAgLy8gIyBTZXR0ZXIgbWV0aG9kcyBmb3IgaW1wbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMC02MDEKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZy52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18yIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZS52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZS52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxNQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxNQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlID0gdmFsdWUuY29weSgpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjMxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZS52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA4IC8vICJpbXBsaWNpdF9rZXlfdHVwbGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM2CiAgICAvLyBzZWxmLmFyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMy02MzQKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM2CiAgICAvLyBzZWxmLmFyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMy02MzQKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfc3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0MAogICAgLy8gc2VsZi5hcmM0X3N0cmluZy52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDAKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYnl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ0CiAgICAvLyBzZWxmLmFyYzRfYnl0ZS52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ0CiAgICAvLyBzZWxmLmFyYzRfYnl0ZS52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDgKICAgIC8vIHNlbGYuYXJjNF9ib29sLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDEyIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDgKICAgIC8vIHNlbGYuYXJjNF9ib29sLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfdWludDEyOFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU2CiAgICAvLyBzZWxmLmFyYzRfdWludDEyOC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU2CiAgICAvLyBzZWxmLmFyYzRfdWludDEyOC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NjAKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlID0gdmFsdWUuY29weSgpCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nFmltcGxpY2l0X2tleV9hcmM0X2J5dGUWaW1wbGljaXRfa2V5X2FyYzRfYm9vbBlpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzGWltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcxJpbXBsaWNpdF9rZXlfdHVwbGUWZXhwbGljaXRfa2V5X2FyYzRfdWludBhleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmcWZXhwbGljaXRfa2V5X2FyYzRfYnl0ZRZleHBsaWNpdF9rZXlfYXJjNF9ib29sGWV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOB9leHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCAAAAAAAAAU5BwAFSGVsbG8QAAAAEAAAAAAAAAAAAAAAAA8ADWR5bmFtaWMgYnl0ZXMxGEAAXSknEGcqJxFnK4ABAGcnBIABgGcnBTIJZycGJxJnJwcnE2cnCIARAAAAAAAAAAoACwAABHRlc3RnJwknEGcnCicRZycLgAEAZycMgAGAZycNMglnJw4nEmcnDycTZzEbQQDhMRkURDEYRIIeBBzJZu4EI2fNSwRpEo6QBGjVkOIERO8GgQQc0pTsBKrI7LEEFmxq/QQ8w7t7BJppRq0E3tdQMwRmJ56TBAluknsEl1MfvARuo/mWBKf09AIEqt3MTARewxFtBCD1bu4EHBSaQwSldax9BIfwhpsERhr8bQQEgRbqBDDjSpME0uZG7wTmdKJwBKh+VA0Ecgo8oAQldwj3NhoAjh4ACQATAB0AJwAyAD0ASABTAF4AaQB0AH8AigCVAKAAqwCyALkAwADIANAA2ADgAOgA8AD4AQABCAEQARgAMRkUMRgUEEMjKWVEKExQsCJDIyplRChMULAiQyMrZUQoTFCwIkMjJwRlRChMULAiQyMnBWVEKExQsCJDIycGZUQoTFCwIkMjJwdlRChMULAiQyMnCGVEKExQsCJDIycJZUQoTFCwIkMjJwplRChMULAiQyMnC2VEKExQsCJDIycMZUQoTFCwIkMjJw1lRChMULAiQyMnDmVEKExQsCJDIycPZUQoTFCwIkMpNhoBZyJDKjYaAWciQys2GgFnIkMnBDYaAWciQycFNhoBZyJDJwY2GgFnIkMnBzYaAWciQycINhoBZyJDJwk2GgFnIkMnCjYaAWciQycLNhoBZyJDJww2GgFnIkMnDTYaAWciQycONhoBZyJDJw82GgFnIkM=", + "approval": "CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nFmltcGxpY2l0X2tleV9hcmM0X2J5dGUWaW1wbGljaXRfa2V5X2FyYzRfYm9vbBlpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzGWltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcxJpbXBsaWNpdF9rZXlfdHVwbGUWZXhwbGljaXRfa2V5X2FyYzRfdWludBhleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmcWZXhwbGljaXRfa2V5X2FyYzRfYnl0ZRZleHBsaWNpdF9rZXlfYXJjNF9ib29sGWV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOB9leHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCAAAAAAAAAU5BwAFSGVsbG8QAAAAEAAAAAAAAAAAAAAAAA8ADWR5bmFtaWMgYnl0ZXMxGEAAXSknEGcqJxFnK4ABAGcnBIABgGcnBTIJZycGJxJnJwcnE2cnCIARAAAAAAAAAAoACwAABHRlc3RnJwknEGcnCicRZycLgAEAZycMgAGAZycNMglnJw4nEmcnDycTZzEbQQDhMRkURDEYRIIeBBzJZu4EI2fNSwRpEo6QBGjVkOIERO8GgQQc0pTsBKrI7LEEFmxq/QQ8w7t7BJppRq0E3tdQMwRmJ56TBAluknsEl1MfvARuo/mWBKf09AIEqt3MTARewxFtBCD1bu4EHBSaQwSldax9BIfwhpsERhr8bQQEgRbqBDDjSpME0uZG7wTmdKJwBKh+VA0Ecgo8oAQldwj3NhoAjh4ACwAVAB8AKQA0AD8ASgBVAGAAawB2AIEAjACXAKIArQC0ALsAwgDKANIA2gDiAOoA8gD6AQIBCgESARoAMRkUMRgUEEQiQyMpZUQoTFCwIkMjKmVEKExQsCJDIytlRChMULAiQyMnBGVEKExQsCJDIycFZUQoTFCwIkMjJwZlRChMULAiQyMnB2VEKExQsCJDIycIZUQoTFCwIkMjJwllRChMULAiQyMnCmVEKExQsCJDIycLZUQoTFCwIkMjJwxlRChMULAiQyMnDWVEKExQsCJDIycOZUQoTFCwIkMjJw9lRChMULAiQyk2GgFnIkMqNhoBZyJDKzYaAWciQycENhoBZyJDJwU2GgFnIkMnBjYaAWciQycHNhoBZyJDJwg2GgFnIkMnCTYaAWciQycKNhoBZyJDJws2GgFnIkMnDDYaAWciQycNNhoBZyJDJw42GgFnIkMnDzYaAWciQw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal b/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal index e1ad44b..5dd2d8d 100644 --- a/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal +++ b/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal @@ -30,7 +30,9 @@ main___algopy_default_create@5: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.StateOps.contract.ITxnOpsContract.verify_itxn_ops[routing]() -> void: diff --git a/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json b/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json index 789adf2..5bfeee8 100644 --- a/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json +++ b/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json @@ -76,19 +76,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMTAwMAogICAgYnl0ZWNibG9jayAweDA2ODEwMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OAogICAgLy8gY2xhc3MgSVR4bk9wc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg0ZTdjZDljYiAvLyBtZXRob2QgInZlcmlmeV9pdHhuX29wcygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmVyaWZ5X2l0eG5fb3BzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92ZXJpZnlfaXR4bl9vcHNfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgdmVyaWZ5X2l0eG5fb3BzCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuSVR4bk9wc0NvbnRyYWN0LnZlcmlmeV9pdHhuX29wc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9pdHhuX29wczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTEKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLmJlZ2luKCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTIKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF90eXBlX2VudW0oYWxnb3B5LlRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwpCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5MwogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X29uX2NvbXBsZXRpb24oYWxnb3B5Lk9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24pCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk0CiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfYXBwcm92YWxfcHJvZ3JhbShCeXRlcy5mcm9tX2hleCgiMDY4MTAxIikpCiAgICBieXRlY18wIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5NS00OTYKICAgIC8vICMgcGFnZXMgZXNzZW50aWFsbHkgYXBwZW5kcwogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X2FwcHJvdmFsX3Byb2dyYW1fcGFnZXMoQnl0ZXMuZnJvbV9oZXgoIjA2ODEwMSIpKQogICAgYnl0ZWNfMCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5NwogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X2NsZWFyX3N0YXRlX3Byb2dyYW0oQnl0ZXMuZnJvbV9oZXgoIjA2ODEwMSIpKQogICAgYnl0ZWNfMCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5OAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X2ZlZShhbGdvcHkub3AuR2xvYmFsLm1pbl90eG5fZmVlKQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTkKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLm5leHQoKQogICAgaXR4bl9uZXh0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAwCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfdHlwZV9lbnVtKGFsZ29weS5UcmFuc2FjdGlvblR5cGUuUGF5bWVudCkKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDEKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9yZWNlaXZlcihhbGdvcHkub3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMgogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X2Ftb3VudChhbGdvcHkuVUludDY0KDEwMDApKQogICAgaW50Y18yIC8vIDEwMDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAzCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDUKICAgIC8vIGFzc2VydCBhbGdvcHkub3AuSVR4bi5yZWNlaXZlcigpID09IGFsZ29weS5vcC5HbG9iYWwuY3JlYXRvcl9hZGRyZXNzCiAgICBpdHhuIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDYKICAgIC8vIGFzc2VydCBhbGdvcHkub3AuSVR4bi5hbW91bnQoKSA9PSBhbGdvcHkuVUludDY0KDEwMDApCiAgICBpdHhuIEFtb3VudAogICAgaW50Y18yIC8vIDEwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDcKICAgIC8vIGFzc2VydCBhbGdvcHkub3AuSVR4bi50eXBlX2VudW0oKSA9PSBhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQKICAgIGl0eG4gVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDkKICAgIC8vIGFzc2VydCBhbGdvcHkub3AuR0lUeG4udHlwZV9lbnVtKDApID09IGFsZ29weS5UcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBnaXR4biAwIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxMAogICAgLy8gYXNzZXJ0IGFsZ29weS5vcC5HSVR4bi50eXBlX2VudW0oMSkgPT0gYWxnb3B5LlRyYW5zYWN0aW9uVHlwZS5QYXltZW50CiAgICBnaXR4biAxIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMTAwMAogICAgYnl0ZWNibG9jayAweDA2ODEwMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OAogICAgLy8gY2xhc3MgSVR4bk9wc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg0ZTdjZDljYiAvLyBtZXRob2QgInZlcmlmeV9pdHhuX29wcygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmVyaWZ5X2l0eG5fb3BzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92ZXJpZnlfaXR4bl9vcHNfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgdmVyaWZ5X2l0eG5fb3BzCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5JVHhuT3BzQ29udHJhY3QudmVyaWZ5X2l0eG5fb3BzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2l0eG5fb3BzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5MQogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuYmVnaW4oKQogICAgaXR4bl9iZWdpbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5MgogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X3R5cGVfZW51bShhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkzCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfb25fY29tcGxldGlvbihhbGdvcHkuT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbikKICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTQKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hcHByb3ZhbF9wcm9ncmFtKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk1LTQ5NgogICAgLy8gIyBwYWdlcyBlc3NlbnRpYWxseSBhcHBlbmRzCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfYXBwcm92YWxfcHJvZ3JhbV9wYWdlcyhCeXRlcy5mcm9tX2hleCgiMDY4MTAxIikpCiAgICBieXRlY18wIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk3CiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbShCeXRlcy5mcm9tX2hleCgiMDY4MTAxIikpCiAgICBieXRlY18wIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk4CiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfZmVlKGFsZ29weS5vcC5HbG9iYWwubWluX3R4bl9mZWUpCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5OQogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUubmV4dCgpCiAgICBpdHhuX25leHQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDAKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF90eXBlX2VudW0oYWxnb3B5LlRyYW5zYWN0aW9uVHlwZS5QYXltZW50KQogICAgaW50Y18wIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMQogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X3JlY2VpdmVyKGFsZ29weS5vcC5HbG9iYWwuY3JlYXRvcl9hZGRyZXNzKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAyCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfYW1vdW50KGFsZ29weS5VSW50NjQoMTAwMCkpCiAgICBpbnRjXzIgLy8gMTAwMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwNQogICAgLy8gYXNzZXJ0IGFsZ29weS5vcC5JVHhuLnJlY2VpdmVyKCkgPT0gYWxnb3B5Lm9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MKICAgIGl0eG4gUmVjZWl2ZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwNgogICAgLy8gYXNzZXJ0IGFsZ29weS5vcC5JVHhuLmFtb3VudCgpID09IGFsZ29weS5VSW50NjQoMTAwMCkKICAgIGl0eG4gQW1vdW50CiAgICBpbnRjXzIgLy8gMTAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwNwogICAgLy8gYXNzZXJ0IGFsZ29weS5vcC5JVHhuLnR5cGVfZW51bSgpID09IGFsZ29weS5UcmFuc2FjdGlvblR5cGUuUGF5bWVudAogICAgaXR4biBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwOQogICAgLy8gYXNzZXJ0IGFsZ29weS5vcC5HSVR4bi50eXBlX2VudW0oMCkgPT0gYWxnb3B5LlRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIGdpdHhuIDAgVHlwZUVudW0KICAgIGludGNfMSAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEwCiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLkdJVHhuLnR5cGVfZW51bSgxKSA9PSBhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQKICAgIGdpdHhuIDEgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyADAQboByYBAwaBATEbQQAYgAROfNnLNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEOxI7IQgQWyGSiyHiiyQCiyHzIAsgG2IrIQMgmyBySyCLO0BzIJEkS0CCQSRLQQIhJEtwAQIxJEtwEQIhJD", + "approval": "CyADAQboByYBAwaBATEbQQAYgAROfNnLNhoAjgEAAQAxGRQxGBBEQgAKMRkUMRgUEEQiQ7EjshCBBbIZKLIeKLJAKLIfMgCyAbYishAyCbIHJLIIs7QHMgkSRLQIJBJEtBAiEkS3ABAjEkS3ARAiEkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/LocalStateContract.approval.teal b/tests/artifacts/StateOps/data/LocalStateContract.approval.teal index 4b004ba..002453c 100644 --- a/tests/artifacts/StateOps/data/LocalStateContract.approval.teal +++ b/tests/artifacts/StateOps/data/LocalStateContract.approval.teal @@ -43,7 +43,9 @@ main___algopy_default_create@26: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.StateOps.contract.LocalStateContract.opt_in[routing]() -> void: diff --git a/tests/artifacts/StateOps/data/LocalStateContract.arc56.json b/tests/artifacts/StateOps/data/LocalStateContract.arc56.json index 907a3fc..5ef7015 100644 --- a/tests/artifacts/StateOps/data/LocalStateContract.arc56.json +++ b/tests/artifacts/StateOps/data/LocalStateContract.arc56.json @@ -466,91 +466,91 @@ }, { "pc": [ - 891 + 893 ], "errorMessage": "check self.arc4_address exists for account" }, { "pc": [ - 877 + 879 ], "errorMessage": "check self.arc4_bool exists for account" }, { "pc": [ - 863 + 865 ], "errorMessage": "check self.arc4_byte exists for account" }, { "pc": [ - 919 + 921 ], "errorMessage": "check self.arc4_dynamic_bytes exists for account" }, { "pc": [ - 849 + 851 ], "errorMessage": "check self.arc4_string exists for account" }, { "pc": [ - 835 + 837 ], "errorMessage": "check self.arc4_uint exists for account" }, { "pc": [ - 905 + 907 ], "errorMessage": "check self.arc4_uint128 exists for account" }, { "pc": [ - 779 + 781 ], "errorMessage": "check self.implicit_key_arc4_address exists for account" }, { "pc": [ - 765 + 767 ], "errorMessage": "check self.implicit_key_arc4_bool exists for account" }, { "pc": [ - 751 + 753 ], "errorMessage": "check self.implicit_key_arc4_byte exists for account" }, { "pc": [ - 807 + 809 ], "errorMessage": "check self.implicit_key_arc4_dynamic_bytes exists for account" }, { "pc": [ - 737 + 739 ], "errorMessage": "check self.implicit_key_arc4_string exists for account" }, { "pc": [ - 724 + 726 ], "errorMessage": "check self.implicit_key_arc4_uint exists for account" }, { "pc": [ - 793 + 795 ], "errorMessage": "check self.implicit_key_arc4_uint128 exists for account" }, { "pc": [ - 821 + 823 ], "errorMessage": "check self.implicit_key_tuple exists for account" } @@ -563,19 +563,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgMHgwMDAwMDAwMDAwMDAwNTM5ICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciIDB4MDAwNTQ4NjU2YzZjNmYgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczICJpbXBsaWNpdF9rZXlfdHVwbGUiICJleHBsaWNpdF9rZXlfYXJjNF91aW50IiAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIiAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIgImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIgImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYzCiAgICAvLyBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGIzY2ZhMzg5IDB4ZGI4NTgxNzYgMHg3ODI2Nzc2MiAweDQyNjM1MWM4IDB4MDc1Y2FlOTEgMHg1OWMwYjgwYiAweDBkNmZhNjkwIDB4OTdlMTBkOWMgMHgyZTRhOGM0OSAweGIyMmNkMjFlIDB4YjNmNDQ3MDEgMHhlZGQ5NzI5NyAweDY3MWQzNTNjIDB4YTNmZDZmZGMgMHhjZDJlNWQ2NiAvLyBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50KGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nKGFkZHJlc3Mpc3RyaW5nIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZShhZGRyZXNzKWJ5dGUiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MoYWRkcmVzcylhZGRyZXNzIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOChhZGRyZXNzKXVpbnQxMjgiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzKGFkZHJlc3MpYnl0ZVtdIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X3R1cGxlKGFkZHJlc3MpKHVpbnQ2NCxieXRlW10sYm9vbCkiLCBtZXRob2QgImdldF9hcmM0X3VpbnQoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImdldF9hcmM0X3N0cmluZyhhZGRyZXNzKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2FyYzRfYnl0ZShhZGRyZXNzKWJ5dGUiLCBtZXRob2QgImdldF9hcmM0X2Jvb2woYWRkcmVzcylib29sIiwgbWV0aG9kICJnZXRfYXJjNF9hZGRyZXNzKGFkZHJlc3MpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludDEyOChhZGRyZXNzKXVpbnQxMjgiLCBtZXRob2QgImdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoYWRkcmVzcylieXRlW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IGdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGdldF9pbXBsaWNpdF9rZXlfdHVwbGUgZ2V0X2FyYzRfdWludCBnZXRfYXJjNF9zdHJpbmcgZ2V0X2FyYzRfYnl0ZSBnZXRfYXJjNF9ib29sIGdldF9hcmM0X2FkZHJlc3MgZ2V0X2FyYzRfdWludDEyOCBnZXRfYXJjNF9keW5hbWljX2J5dGVzCiAgICBlcnIKCm1haW5fb3B0X2luX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gT3B0SW4KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBPcHRJbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIG9wdF9pbgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyNjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50NjQoMTMzNykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWNfMSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGJ5dGVjIDQgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5MAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5CeXRlKDApCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5MQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5Cb29sKFRydWUpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5MgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5BZGRyZXNzKAogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5MwogICAgLy8gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkyLTY5NAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5BZGRyZXNzKAogICAgLy8gICAgIEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MKICAgIC8vICkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDEyOCgyKioxMDApCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTYKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKAogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxMCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTYtNjk4CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcygKICAgIC8vICAgICBiImR5bmFtaWMgYnl0ZXMiCiAgICAvLyApCiAgICBieXRlYyAxMSAvLyAweDAwMGQ2NDc5NmU2MTZkNjk2MzIwNjI3OTc0NjU3MwogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5OQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGVbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSAoVUludDY0KDEwKSwgQnl0ZXMoYiJ0ZXN0IiksIEZhbHNlKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxMiAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMQogICAgLy8gc2VsZi5hcmM0X3VpbnRbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQ2NCgxMzM3KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzAyCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5TdHJpbmcoIkhlbGxvIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5TdHJpbmcoIkhlbGxvIikKICAgIGJ5dGVjIDQgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMgogICAgLy8gc2VsZi5hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzAzCiAgICAvLyBzZWxmLmFyYzRfYnl0ZVtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQnl0ZSgwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIHB1c2hieXRlcyAweDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA0CiAgICAvLyBzZWxmLmFyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxNiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgcHVzaGJ5dGVzIDB4ODAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDQKICAgIC8vIHNlbGYuYXJjNF9ib29sW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5Cb29sKFRydWUpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA1CiAgICAvLyBzZWxmLmFyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxNyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjhbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQxMjgoMioqMTAwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxOCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcyhiImR5bmFtaWMgYnl0ZXMiKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTYtNjk4CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcygKICAgIC8vICAgICBiImR5bmFtaWMgYnl0ZXMiCiAgICAvLyApCiAgICBieXRlYyAxMSAvLyAweDAwMGQ2NDc5NmU2MTZkNjk2MzIwNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcyhiImR5bmFtaWMgYnl0ZXMiKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDktNzEwCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxMgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwOS03MTAKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE2CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzIwCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzI0CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzI4CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMyCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM2CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTAgLy8gImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDAKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV90dXBsZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJpbXBsaWNpdF9rZXlfdHVwbGUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQyLTc0MwogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDUKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfdWludFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0Mi03NDMKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0OQogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9zdHJpbmdbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9zdHJpbmcgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYnl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MwogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ieXRlW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2J5dGUgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NwogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ib29sW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTYgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2Jvb2wgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MQogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9hZGRyZXNzW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTcgLy8gImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2FkZHJlc3MgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfdWludDEyOFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NQogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50MTI4W2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTggLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQxMjggZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2OQogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTkgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXMgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgMHgwMDAwMDAwMDAwMDAwNTM5ICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciIDB4MDAwNTQ4NjU2YzZjNmYgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczICJpbXBsaWNpdF9rZXlfdHVwbGUiICJleHBsaWNpdF9rZXlfYXJjNF91aW50IiAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIiAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIgImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIgImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYzCiAgICAvLyBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGIzY2ZhMzg5IDB4ZGI4NTgxNzYgMHg3ODI2Nzc2MiAweDQyNjM1MWM4IDB4MDc1Y2FlOTEgMHg1OWMwYjgwYiAweDBkNmZhNjkwIDB4OTdlMTBkOWMgMHgyZTRhOGM0OSAweGIyMmNkMjFlIDB4YjNmNDQ3MDEgMHhlZGQ5NzI5NyAweDY3MWQzNTNjIDB4YTNmZDZmZGMgMHhjZDJlNWQ2NiAvLyBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50KGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nKGFkZHJlc3Mpc3RyaW5nIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZShhZGRyZXNzKWJ5dGUiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MoYWRkcmVzcylhZGRyZXNzIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOChhZGRyZXNzKXVpbnQxMjgiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzKGFkZHJlc3MpYnl0ZVtdIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X3R1cGxlKGFkZHJlc3MpKHVpbnQ2NCxieXRlW10sYm9vbCkiLCBtZXRob2QgImdldF9hcmM0X3VpbnQoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImdldF9hcmM0X3N0cmluZyhhZGRyZXNzKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2FyYzRfYnl0ZShhZGRyZXNzKWJ5dGUiLCBtZXRob2QgImdldF9hcmM0X2Jvb2woYWRkcmVzcylib29sIiwgbWV0aG9kICJnZXRfYXJjNF9hZGRyZXNzKGFkZHJlc3MpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludDEyOChhZGRyZXNzKXVpbnQxMjgiLCBtZXRob2QgImdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoYWRkcmVzcylieXRlW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IGdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGdldF9pbXBsaWNpdF9rZXlfdHVwbGUgZ2V0X2FyYzRfdWludCBnZXRfYXJjNF9zdHJpbmcgZ2V0X2FyYzRfYnl0ZSBnZXRfYXJjNF9ib29sIGdldF9hcmM0X2FkZHJlc3MgZ2V0X2FyYzRfdWludDEyOCBnZXRfYXJjNF9keW5hbWljX2J5dGVzCiAgICBlcnIKCm1haW5fb3B0X2luX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gT3B0SW4KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBPcHRJbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIG9wdF9pbgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyNjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5vcHRfaW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg4CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnRbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQ2NCgxMzM3KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5TdHJpbmcoIkhlbGxvIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgNCAvLyAweDAwMDU0ODY1NmM2YzZmCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkwCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGVbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJ5dGUoMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIHB1c2hieXRlcyAweDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIHB1c2hieXRlcyAweDgwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkyCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3NbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkFkZHJlc3MoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkzCiAgICAvLyBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTItNjk0CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3NbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkFkZHJlc3MoCiAgICAvLyAgICAgR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgLy8gKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5NQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50MTI4KDIqKjEwMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5NgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDEwIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5Ni02OTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKAogICAgLy8gICAgIGIiZHluYW1pYyBieXRlcyIKICAgIC8vICkKICAgIGJ5dGVjIDExIC8vIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZVtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDEyIC8vICJpbXBsaWNpdF9rZXlfdHVwbGUiCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDBhMDAwYjAwMDAwNDc0NjU3Mzc0CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzAxCiAgICAvLyBzZWxmLmFyYzRfdWludFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDY0KDEzMzcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDIKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4OQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYnl0ZWMgNCAvLyAweDAwMDU0ODY1NmM2YzZmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzAyCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5TdHJpbmcoIkhlbGxvIikKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDMKICAgIC8vIHNlbGYuYXJjNF9ieXRlW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5CeXRlKDApCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDQKICAgIC8vIHNlbGYuYXJjNF9ib29sW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5Cb29sKFRydWUpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE2IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5MQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5Cb29sKFRydWUpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNAogICAgLy8gc2VsZi5hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDUKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA2CiAgICAvLyBzZWxmLmFyYzRfdWludDEyOFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDEyOCgyKioxMDApCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE4IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA3CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE5IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5Ni02OTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKAogICAgLy8gICAgIGIiZHluYW1pYyBieXRlcyIKICAgIC8vICkKICAgIGJ5dGVjIDExIC8vIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA3CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwOS03MTAKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzEyCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50W2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA5LTcxMAogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgaW1wbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTYKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjAKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGVbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA1IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjQKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2xbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjgKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3NbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzIKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA4IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzYKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0MAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTIgLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV90dXBsZSBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDItNzQzCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NQogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50W2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQyLTc0MwogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ5CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3N0cmluZ1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3N0cmluZyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzUzCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2J5dGVbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYnl0ZSBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzU3CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2Jvb2xbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYm9vbCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzYxCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2FkZHJlc3NbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYWRkcmVzcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzY1CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnQxMjhbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxOCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfdWludDEyOCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXNbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQIAAAAAAAABTkYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nBwAFSGVsbG8WaW1wbGljaXRfa2V5X2FyYzRfYnl0ZRZpbXBsaWNpdF9rZXlfYXJjNF9ib29sGWltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOBAAAAAQAAAAAAAAAAAAAAAAH2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMPAA1keW5hbWljIGJ5dGVzEmltcGxpY2l0X2tleV90dXBsZRZleHBsaWNpdF9rZXlfYXJjNF91aW50GGV4cGxpY2l0X2tleV9hcmM0X3N0cmluZxZleHBsaWNpdF9rZXlfYXJjNF9ieXRlFmV4cGxpY2l0X2tleV9hcmM0X2Jvb2wZZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcxlleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4H2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMxG0EAkIAEMMbVijYaAI4BAHgxGRREMRhEgg8Es8+jiQTbhYF2BHgmd2IEQmNRyAQHXK6RBFnAuAsEDW+mkASX4Q2cBC5KjEkEsizSHgSz9EcBBO3ZcpcEZx01PASj/W/cBM0uXWY2GgCODwCQAJ0AqgC4AMYA1ADiAPAA/gEMARoBKAE2AUQBUgAxGSISMRgQREIACDEZFDEYFBBDMgkpKmYyCSsnBGYyCScFgAEAZjIJJwaAAYBmMgknBzIJZjIJJwgnCWYyCScKJwtmMgknDIARAAAAAAAAAAoACwAABHRlc3RmMgknDSpmMgknDicEZjIJJw+AAQBmMgknEIABgGYyCScRMglmMgknEicJZjIJJxMnC2YiQzYaASMpY0QoTFCwIkM2GgEjK2NEKExQsCJDNhoBIycFY0QoTFCwIkM2GgEjJwZjRChMULAiQzYaASMnB2NEKExQsCJDNhoBIycIY0QoTFCwIkM2GgEjJwpjRChMULAiQzYaASMnDGNEKExQsCJDNhoBIycNY0QoTFCwIkM2GgEjJw5jRChMULAiQzYaASMnD2NEKExQsCJDNhoBIycQY0QoTFCwIkM2GgEjJxFjRChMULAiQzYaASMnEmNEKExQsCJDNhoBIycTY0QoTFCwIkM=", + "approval": "CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQIAAAAAAAABTkYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nBwAFSGVsbG8WaW1wbGljaXRfa2V5X2FyYzRfYnl0ZRZpbXBsaWNpdF9rZXlfYXJjNF9ib29sGWltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOBAAAAAQAAAAAAAAAAAAAAAAH2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMPAA1keW5hbWljIGJ5dGVzEmltcGxpY2l0X2tleV90dXBsZRZleHBsaWNpdF9rZXlfYXJjNF91aW50GGV4cGxpY2l0X2tleV9hcmM0X3N0cmluZxZleHBsaWNpdF9rZXlfYXJjNF9ieXRlFmV4cGxpY2l0X2tleV9hcmM0X2Jvb2wZZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcxlleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4H2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMxG0EAkIAEMMbVijYaAI4BAHgxGRREMRhEgg8Es8+jiQTbhYF2BHgmd2IEQmNRyAQHXK6RBFnAuAsEDW+mkASX4Q2cBC5KjEkEsizSHgSz9EcBBO3ZcpcEZx01PASj/W/cBM0uXWY2GgCODwCSAJ8ArAC6AMgA1gDkAPIBAAEOARwBKgE4AUYBVAAxGSISMRgQREIACjEZFDEYFBBEIkMyCSkqZjIJKycEZjIJJwWAAQBmMgknBoABgGYyCScHMglmMgknCCcJZjIJJwonC2YyCScMgBEAAAAAAAAACgALAAAEdGVzdGYyCScNKmYyCScOJwRmMgknD4ABAGYyCScQgAGAZjIJJxEyCWYyCScSJwlmMgknEycLZiJDNhoBIyljRChMULAiQzYaASMrY0QoTFCwIkM2GgEjJwVjRChMULAiQzYaASMnBmNEKExQsCJDNhoBIycHY0QoTFCwIkM2GgEjJwhjRChMULAiQzYaASMnCmNEKExQsCJDNhoBIycMY0QoTFCwIkM2GgEjJw1jRChMULAiQzYaASMnDmNEKExQsCJDNhoBIycPY0QoTFCwIkM2GgEjJxBjRChMULAiQzYaASMnEWNEKExQsCJDNhoBIycSY0QoTFCwIkM2GgEjJxNjRChMULAiQw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal b/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal index fa425d3..91a4033 100644 --- a/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal @@ -25,7 +25,9 @@ main___algopy_default_create@22: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_balance[routing]() -> void: diff --git a/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json b/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json index 8a244de..59eafb7 100644 --- a/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json @@ -368,84 +368,84 @@ }, { "pc": [ - 171, - 225 + 173, + 227 ], "errorMessage": "account funded" }, { "pc": [ - 175 + 177 ], "errorMessage": "expected Account balance to match" }, { "pc": [ - 229 + 231 ], "errorMessage": "expected Account min_balance to match" }, { "pc": [ - 166, - 220, - 273, - 301, - 330, - 359, - 388, - 417, - 446, - 475, - 504, - 533, - 562, - 598, - 627 + 168, + 222, + 275, + 303, + 332, + 361, + 390, + 419, + 448, + 477, + 506, + 535, + 564, + 600, + 629 ], "errorMessage": "expected funded by index to match" }, { "pc": [ - 190 + 192 ], "errorMessage": "expected op.balance by index to match" }, { "pc": [ - 181 + 183 ], "errorMessage": "expected op.balance to match" }, { "pc": [ - 244 + 246 ], "errorMessage": "expected op.min_balance by index to match" }, { "pc": [ - 235 + 237 ], "errorMessage": "expected op.min_balance to match" }, { "pc": [ - 164, - 218, - 271, - 299, - 328, - 357, - 386, - 415, - 444, - 473, - 502, - 531, - 560, - 596, - 625 + 166, + 220, + 273, + 301, + 330, + 359, + 388, + 417, + 446, + 475, + 504, + 533, + 562, + 598, + 627 ], "errorMessage": "expected value by index to match" } @@ -458,19 +458,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg1ZjViNDNlNCAweDczZGM5M2M3IDB4NTYyNmRmZWIgMHhkYzhhMjViZiAweDE5OGViZDhjIDB4MjMwMWFiMjYgMHg5ZjY4ZmNhNiAweGE5NzVjMmQxIDB4ZDFlMDQ4MDEgMHhiNjk2NmJlNSAweDE5NWQ1NDE4IDB4NmFkYWUzZjEgMHhkZjhjZmVlNSAweDZhZDcwZDIxIDB4MTczNWZkMjIgLy8gbWV0aG9kICJ2ZXJpZnlfYWNjdF9iYWxhbmNlKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfYXV0aF9hZGRyKGFjY291bnQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbihhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0cyhhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfYm94ZXMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcyhhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlKGFjY291bnQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWQoYWNjb3VudCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYWNjdF9iYWxhbmNlIHZlcmlmeV9hY2N0X21pbl9iYWxhbmNlIHZlcmlmeV9hY2N0X2F1dGhfYWRkciB2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludCB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZSB2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4gdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQgdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzIHZlcmlmeV9hY2N0X3RvdGFsX2JveGVzIHZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcyB2ZXJpZnlfYWNjdF9pbmNlbnRpdmVfZWxpZ2libGUgdmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXQgdmVyaWZ5X2FjY3RfbGFzdF9wcm9wb3NlZAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIyOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2JhbGFuY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShhKQogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYS5iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBiYWxhbmNlIHRvIG1hdGNoIgogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBBY2NvdW50IGJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gYXNzZXJ0IHZhbHVlID09IGFsZ29weS5vcC5iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AuYmFsYW5jZSB0byBtYXRjaCIKICAgIHN3YXAKICAgIGJhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLmJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMtMzUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AuYmFsYW5jZSgKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKSwgImV4cGVjdGVkIG9wLmJhbGFuY2UgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBiYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9taW5fYmFsYW5jZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDAKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbWluX2JhbGFuY2UoYSkKICAgIGR1cAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X21pbl9iYWxhbmNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhLm1pbl9iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaCIKICAgIGRpZyAxCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYWxnb3B5Lm9wLm1pbl9iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2giCiAgICBzd2FwCiAgICBtaW5fYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYtNDgKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AubWluX2JhbGFuY2UoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICksICJleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCIKICAgIG1pbl9iYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfYXV0aF9hZGRyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfYXV0aF9hZGRyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTMKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYXV0aF9hZGRyKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwLTcyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxFeHRyYUFwcFBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjgwLTgyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcygKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4MwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkwCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5MgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc09wdGVkSW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXBwc19vcHRlZF9pbihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzT3B0ZWRJbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTA1CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDYtMTA4CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hc3NldHMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTE2CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIzCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveEJ5dGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hfYnl0ZXMoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfaW5jZW50aXZlX2VsaWdpYmxlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9pbmNlbnRpdmVfZWxpZ2libGUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDIKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9sYXN0X2hlYXJ0YmVhdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9sYXN0X2hlYXJ0YmVhdChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RMYXN0SGVhcnRiZWF0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0OAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9sYXN0X2hlYXJ0YmVhdChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdEhlYXJ0YmVhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUwCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfbGFzdF9wcm9wb3NlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTU1CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2xhc3RfcHJvcG9zZWQoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdFByb3Bvc2VkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9sYXN0X3Byb3Bvc2VkKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RMYXN0UHJvcG9zZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg1ZjViNDNlNCAweDczZGM5M2M3IDB4NTYyNmRmZWIgMHhkYzhhMjViZiAweDE5OGViZDhjIDB4MjMwMWFiMjYgMHg5ZjY4ZmNhNiAweGE5NzVjMmQxIDB4ZDFlMDQ4MDEgMHhiNjk2NmJlNSAweDE5NWQ1NDE4IDB4NmFkYWUzZjEgMHhkZjhjZmVlNSAweDZhZDcwZDIxIDB4MTczNWZkMjIgLy8gbWV0aG9kICJ2ZXJpZnlfYWNjdF9iYWxhbmNlKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfYXV0aF9hZGRyKGFjY291bnQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbihhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0cyhhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfYm94ZXMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcyhhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlKGFjY291bnQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWQoYWNjb3VudCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYWNjdF9iYWxhbmNlIHZlcmlmeV9hY2N0X21pbl9iYWxhbmNlIHZlcmlmeV9hY2N0X2F1dGhfYWRkciB2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludCB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZSB2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4gdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQgdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzIHZlcmlmeV9hY2N0X3RvdGFsX2JveGVzIHZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcyB2ZXJpZnlfYWNjdF9pbmNlbnRpdmVfZWxpZ2libGUgdmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXQgdmVyaWZ5X2FjY3RfbGFzdF9wcm9wb3NlZAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIyOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfYmFsYW5jZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X2JhbGFuY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9iYWxhbmNlKGEpCiAgICBkdXAKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9iYWxhbmNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhLmJhbGFuY2UsICJleHBlY3RlZCBBY2NvdW50IGJhbGFuY2UgdG8gbWF0Y2giCiAgICBkaWcgMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIEFjY291bnQgYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYWxnb3B5Lm9wLmJhbGFuY2UoYSksICJleHBlY3RlZCBvcC5iYWxhbmNlIHRvIG1hdGNoIgogICAgc3dhcAogICAgYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AuYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMy0zNQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGFsZ29weS5vcC5iYWxhbmNlKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApLCAiZXhwZWN0ZWQgb3AuYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGJhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLmJhbGFuY2UgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MAogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9taW5fYmFsYW5jZShhKQogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbWluX2JhbGFuY2UoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MgogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NAogICAgLy8gYXNzZXJ0IHZhbHVlID09IGEubWluX2JhbGFuY2UsICJleHBlY3RlZCBBY2NvdW50IG1pbl9iYWxhbmNlIHRvIG1hdGNoIgogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBBY2NvdW50IG1pbl9iYWxhbmNlIHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AubWluX2JhbGFuY2UoYSksICJleHBlY3RlZCBvcC5taW5fYmFsYW5jZSB0byBtYXRjaCIKICAgIHN3YXAKICAgIG1pbl9iYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5taW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0Ni00OAogICAgLy8gYXNzZXJ0IHZhbHVlID09IGFsZ29weS5vcC5taW5fYmFsYW5jZSgKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKSwgImV4cGVjdGVkIG9wLm1pbl9iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgbWluX2JhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLm1pbl9iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9hdXRoX2FkZHJbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9hdXRoX2FkZHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9hdXRoX2FkZHIoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYXV0aF9hZGRyKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RBdXRoQWRkcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV91aW50KGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MgogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2UoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzAtNzIKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2UoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcyhhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODAtODIKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsRXh0cmFBcHBQYWdlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4NAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXBwc19jcmVhdGVkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc0NyZWF0ZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTAKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXBwc19jcmVhdGVkKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzT3B0ZWRJbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5OAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNPcHRlZEluCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHNfY3JlYXRlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDUKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwNi0xMDgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTA5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hc3NldHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTE1CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTYKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYm94ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9ib3hlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjMKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYm94ZXMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxCb3hlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjQKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYm94ZXMoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzEKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYm94X2J5dGVzKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTMyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxCb3hCeXRlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTM0CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9pbmNlbnRpdmVfZWxpZ2libGUoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0SW5jZW50aXZlRWxpZ2libGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQwCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2luY2VudGl2ZV9lbGlnaWJsZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0SW5jZW50aXZlRWxpZ2libGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0MgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgcHVzaGludCAwIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQ3CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2xhc3RfaGVhcnRiZWF0KGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RIZWFydGJlYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQ4CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2xhc3RfaGVhcnRiZWF0KF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RMYXN0SGVhcnRiZWF0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfbGFzdF9wcm9wb3NlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTUKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9wcm9wb3NlZChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RMYXN0UHJvcG9zZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2xhc3RfcHJvcG9zZWQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RQcm9wb3NlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTU4CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyABASYBBBUffHUxG0EAeDEZFEQxGESCDwRfW0PkBHPck8cEVibf6wTciiW/BBmOvYwEIwGrJgSfaPymBKl1wtEE0eBIAQS2lmvlBBldVBgEatrj8QTfjP7lBGrXDSEEFzX9IjYaAI4PAAkAPwB1AJEArgDLAOgBBQEiAT8BXAF5AZYBugHXADEZFDEYFBBDNhoBF8AcSXMANhoBF3MASwNPAhJEEkRLAXMAREsBEkRMYEsBEkQ2GgEXYEsBEkQWKExQsCJDNhoBF8AcSXMBNhoBF3MBSwNPAhJEEkRLAXMBREsBEkRMeEsBEkQ2GgEXeEsBEkQWKExQsCJDNhoBF8AccwI2GgEXcwJLA08CEkQSRChMULAiQzYaARfAHHMDNhoBF3MDSwNPAhJEEkQWKExQsCJDNhoBF8AccwQ2GgEXcwRLA08CEkQSRBYoTFCwIkM2GgEXwBxzBTYaARdzBUsDTwISRBJEFihMULAiQzYaARfAHHMGNhoBF3MGSwNPAhJEEkQWKExQsCJDNhoBF8Accwc2GgEXcwdLA08CEkQSRBYoTFCwIkM2GgEXwBxzCDYaARdzCEsDTwISRBJEFihMULAiQzYaARfAHHMJNhoBF3MJSwNPAhJEEkQWKExQsCJDNhoBF8Accwo2GgEXcwpLA08CEkQSRBYoTFCwIkM2GgEXwBxzCzYaARdzC0sDTwISRBJEFihMULAiQzYaARfAHHMMNhoBF3MMSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARfAHHMONhoBF3MOSwNPAhJEEkQWKExQsCJDNhoBF8Accw02GgEXcw1LA08CEkQSRBYoTFCwIkM=", + "approval": "CyABASYBBBUffHUxG0EAeDEZFEQxGESCDwRfW0PkBHPck8cEVibf6wTciiW/BBmOvYwEIwGrJgSfaPymBKl1wtEE0eBIAQS2lmvlBBldVBgEatrj8QTfjP7lBGrXDSEEFzX9IjYaAI4PAAsAQQB3AJMAsADNAOoBBwEkAUEBXgF7AZgBvAHZADEZFDEYFBBEIkM2GgEXwBxJcwA2GgEXcwBLA08CEkQSREsBcwBESwESRExgSwESRDYaARdgSwESRBYoTFCwIkM2GgEXwBxJcwE2GgEXcwFLA08CEkQSREsBcwFESwESREx4SwESRDYaARd4SwESRBYoTFCwIkM2GgEXwBxzAjYaARdzAksDTwISRBJEKExQsCJDNhoBF8AccwM2GgEXcwNLA08CEkQSRBYoTFCwIkM2GgEXwBxzBDYaARdzBEsDTwISRBJEFihMULAiQzYaARfAHHMFNhoBF3MFSwNPAhJEEkQWKExQsCJDNhoBF8AccwY2GgEXcwZLA08CEkQSRBYoTFCwIkM2GgEXwBxzBzYaARdzB0sDTwISRBJEFihMULAiQzYaARfAHHMINhoBF3MISwNPAhJEEkQWKExQsCJDNhoBF8Accwk2GgEXcwlLA08CEkQSRBYoTFCwIkM2GgEXwBxzCjYaARdzCksDTwISRBJEFihMULAiQzYaARfAHHMLNhoBF3MLSwNPAhJEEkQWKExQsCJDNhoBF8Accww2GgEXcwxLA08CEkQSRIABAIEATwJUKExQsCJDNhoBF8Accw42GgEXcw5LA08CEkQSRBYoTFCwIkM2GgEXwBxzDTYaARdzDUsDTwISRBJEFihMULAiQw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal b/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal index f6aab17..56f7dba 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal @@ -25,7 +25,9 @@ main___algopy_default_create@16: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.StateOps.contract.StateAppGlobalContract.verify_get_bytes[routing]() -> void: diff --git a/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json b/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json index eb55b98..17af0c8 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json @@ -234,19 +234,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQ1CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhhOTk3YTE4NyAweDRkYjhhYTQxIDB4MGMxZjU2YTcgMHhhZmRkYjA4OCAweDkzYTg1MmUxIDB4MzY5OTY0NTEgMHgzOTIwYTU3YiAvLyBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2dldF91aW50NjQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF9ieXRlcyh1aW50NjQsYnl0ZVtdKShieXRlW10sYm9vbCkiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfdWludDY0KHVpbnQ2NCxieXRlW10pKHVpbnQ2NCxib29sKSIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShieXRlW10pdm9pZCIsIG1ldGhvZCAidmVyaWZ5X3B1dF91aW50NjQoYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGJ5dGVbXSxieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9nZXRfYnl0ZXMgdmVyaWZ5X2dldF91aW50NjQgdmVyaWZ5X2dldF9leF9ieXRlcyB2ZXJpZnlfZ2V0X2V4X3VpbnQ2NCB2ZXJpZnlfZGVsZXRlIHZlcmlmeV9wdXRfdWludDY0IHZlcmlmeV9wdXRfYnl0ZXMKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU5CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfYnl0ZXMoYSkKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY0CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfdWludDY0KGEpCiAgICBhcHBfZ2xvYmFsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2OQogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRfZXhfYnl0ZXMoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDczCiAgICAvLyByZXR1cm4gb3AuQXBwR2xvYmFsLmdldF9leF91aW50NjQoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc3CiAgICAvLyBvcC5BcHBHbG9iYWwuZGVsZXRlKGEpCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgxCiAgICAvLyBvcC5BcHBHbG9iYWwucHV0KGEsIGIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODUKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQ1CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhhOTk3YTE4NyAweDRkYjhhYTQxIDB4MGMxZjU2YTcgMHhhZmRkYjA4OCAweDkzYTg1MmUxIDB4MzY5OTY0NTEgMHgzOTIwYTU3YiAvLyBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2dldF91aW50NjQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF9ieXRlcyh1aW50NjQsYnl0ZVtdKShieXRlW10sYm9vbCkiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfdWludDY0KHVpbnQ2NCxieXRlW10pKHVpbnQ2NCxib29sKSIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShieXRlW10pdm9pZCIsIG1ldGhvZCAidmVyaWZ5X3B1dF91aW50NjQoYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGJ5dGVbXSxieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9nZXRfYnl0ZXMgdmVyaWZ5X2dldF91aW50NjQgdmVyaWZ5X2dldF9leF9ieXRlcyB2ZXJpZnlfZ2V0X2V4X3VpbnQ2NCB2ZXJpZnlfZGVsZXRlIHZlcmlmeV9wdXRfdWludDY0IHZlcmlmeV9wdXRfYnl0ZXMKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwR2xvYmFsQ29udHJhY3QudmVyaWZ5X2dldF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NTkKICAgIC8vIHZhbHVlID0gb3AuQXBwR2xvYmFsLmdldF9ieXRlcyhhKQogICAgYXBwX2dsb2JhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjQKICAgIC8vIHZhbHVlID0gb3AuQXBwR2xvYmFsLmdldF91aW50NjQoYSkKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfZXhfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2V4X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY5CiAgICAvLyByZXR1cm4gb3AuQXBwR2xvYmFsLmdldF9leF9ieXRlcyhhLCBiKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoYnl0ZXMgMHgwMDAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfZXhfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NzMKICAgIC8vIHJldHVybiBvcC5BcHBHbG9iYWwuZ2V0X2V4X3VpbnQ2NChhLCBiKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwR2xvYmFsQ29udHJhY3QudmVyaWZ5X2RlbGV0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9kZWxldGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NzcKICAgIC8vIG9wLkFwcEdsb2JhbC5kZWxldGUoYSkKICAgIGFwcF9nbG9iYWxfZGVsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9wdXRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODEKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9wdXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4NQogICAgLy8gb3AuQXBwR2xvYmFsLnB1dChhLCBiKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyACAQAmAgQVH3x1AQAxG0EAQDEZFEQxGESCBwSpl6GHBE24qkEEDB9WpwSv3bCIBJOoUuEENplkUQQ5IKV7NhoAjgcACQAeACwAVABtAHYAgwAxGRQxGBQQQzYaAVcCAGRJFRZXBgJMUChMULAiQzYaAVcCAGQWKExQsCJDNhoBFzYaAlcCAGVLARUWVwYCTwJQKSNPA1SAAgADTFBMUChMULAiQzYaARc2GgJXAgBlTBYpI08DVFAoTFCwIkM2GgFXAgBpIkM2GgFXAgA2GgIXZyJDNhoBVwIANhoCVwIAZyJD", + "approval": "CyACAQAmAgQVH3x1AQAxG0EAQDEZFEQxGESCBwSpl6GHBE24qkEEDB9WpwSv3bCIBJOoUuEENplkUQQ5IKV7NhoAjgcACwAgAC4AVgBvAHgAhQAxGRQxGBQQRCJDNhoBVwIAZEkVFlcGAkxQKExQsCJDNhoBVwIAZBYoTFCwIkM2GgEXNhoCVwIAZUsBFRZXBgJPAlApI08DVIACAANMUExQKExQsCJDNhoBFzYaAlcCAGVMFikjTwNUUChMULAiQzYaAVcCAGkiQzYaAVcCADYaAhdnIkM2GgFXAgA2GgJXAgBnIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal b/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal index 01e7dd9..23c0a8f 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal @@ -70,4 +70,6 @@ main_after_if_else@2: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + 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 85d69a3..afcf530 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json @@ -84,19 +84,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMxCiAgICAvLyBrZXk9Imdsb2JhbF91aW50NjQiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gVUludDY0KDIpLAogICAgcHVzaGludCAyIC8vIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjktNDMyCiAgICAvLyBzZWxmLmdsb2JhbF91aW50NjQgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBVSW50NjQoMiksCiAgICAvLyAgICAga2V5PSJnbG9iYWxfdWludDY0IiwKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM1CiAgICAvLyBrZXk9Imdsb2JhbF9ieXRlcyIsCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzQKICAgIC8vIEJ5dGVzKGIiZHVtbXlfYnl0ZXMiKSwKICAgIGJ5dGVjXzAgLy8gMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMzLTQzNgogICAgLy8gc2VsZi5nbG9iYWxfYnl0ZXMgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBCeXRlcyhiImR1bW15X2J5dGVzIiksCiAgICAvLyAgICAga2V5PSJnbG9iYWxfYnl0ZXMiLAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdCA9IGFsZ29weS5VSW50NjQoMikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdCIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gc2VsZi5nbG9iYWxfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuQnl0ZXMoYiJkdW1teV9ieXRlcyIpCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9ieXRlc19leHBsaWNpdCIKICAgIGJ5dGVjXzAgLy8gMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ0MAogICAgLy8gYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpLCBrZXk9Imdsb2JhbF9hcmM0X2J5dGVzIgogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzktNDQxCiAgICAvLyBzZWxmLmdsb2JhbF9hcmM0X2J5dGVzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpLCBrZXk9Imdsb2JhbF9hcmM0X2J5dGVzIgogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDIKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQwCiAgICAvLyBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICBieXRlY18xIC8vIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQyCiAgICAvLyBzZWxmLmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0ID0gYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI3CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMxCiAgICAvLyBrZXk9Imdsb2JhbF91aW50NjQiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gVUludDY0KDIpLAogICAgcHVzaGludCAyIC8vIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjktNDMyCiAgICAvLyBzZWxmLmdsb2JhbF91aW50NjQgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBVSW50NjQoMiksCiAgICAvLyAgICAga2V5PSJnbG9iYWxfdWludDY0IiwKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM1CiAgICAvLyBrZXk9Imdsb2JhbF9ieXRlcyIsCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzQKICAgIC8vIEJ5dGVzKGIiZHVtbXlfYnl0ZXMiKSwKICAgIGJ5dGVjXzAgLy8gMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMzLTQzNgogICAgLy8gc2VsZi5nbG9iYWxfYnl0ZXMgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBCeXRlcyhiImR1bW15X2J5dGVzIiksCiAgICAvLyAgICAga2V5PSJnbG9iYWxfYnl0ZXMiLAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdCA9IGFsZ29weS5VSW50NjQoMikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdCIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gc2VsZi5nbG9iYWxfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuQnl0ZXMoYiJkdW1teV9ieXRlcyIpCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9ieXRlc19leHBsaWNpdCIKICAgIGJ5dGVjXzAgLy8gMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ0MAogICAgLy8gYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpLCBrZXk9Imdsb2JhbF9hcmM0X2J5dGVzIgogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzktNDQxCiAgICAvLyBzZWxmLmdsb2JhbF9hcmM0X2J5dGVzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpLCBrZXk9Imdsb2JhbF9hcmM0X2J5dGVzIgogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDIKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQwCiAgICAvLyBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICBieXRlY18xIC8vIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQyCiAgICAvLyBzZWxmLmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0ID0gYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI3CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyYCC2R1bW15X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlczEYQACJgA1nbG9iYWxfdWludDY0gQJngAxnbG9iYWxfYnl0ZXMoZ4AWZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdIECZ4AVZ2xvYmFsX2J5dGVzX2V4cGxpY2l0KGeAEWdsb2JhbF9hcmM0X2J5dGVzKWeAGmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0KWcxGxREMRkUMRgUEEM=", + "approval": "CyYCC2R1bW15X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlczEYQACJgA1nbG9iYWxfdWludDY0gQJngAxnbG9iYWxfYnl0ZXMoZ4AWZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdIECZ4AVZ2xvYmFsX2J5dGVzX2V4cGxpY2l0KGeAEWdsb2JhbF9hcmM0X2J5dGVzKWeAGmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0KWcxGxREMRkUMRgUEESBAUM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal b/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal index 08ac80d..ac840c7 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal @@ -43,7 +43,9 @@ main___algopy_default_create@19: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.StateOps.contract.StateAppLocalContract.opt_in[routing]() -> void: diff --git a/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json b/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json index c24e776..f7f20ff 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json @@ -309,19 +309,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOQogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhhODgzMDJmZSAweDQ5YjdkZGY5IDB4YzA3OGJlYWQgMHhhNTJmOTkyYiAweDhjNTZhZDkwIDB4NGM3YWQ4MjMgMHhjYWE3Yjg2NCAweDI0ZjlmMDg1IC8vIG1ldGhvZCAidmVyaWZ5X2dldF9ieXRlcyhhZGRyZXNzLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF9ieXRlcyhhZGRyZXNzLHVpbnQ2NCxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X2V4X3VpbnQ2NChhZGRyZXNzLHVpbnQ2NCxieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZGVsZXRlKGFkZHJlc3MsYnl0ZVtdKXZvaWQiLCBtZXRob2QgInZlcmlmeV9leGlzdHMoYWRkcmVzcyxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3B1dF91aW50NjQoYWRkcmVzcyxieXRlW10sdWludDY0KXZvaWQiLCBtZXRob2QgInZlcmlmeV9wdXRfYnl0ZXMoYWRkcmVzcyxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfZ2V0X2J5dGVzIHZlcmlmeV9nZXRfdWludDY0IHZlcmlmeV9nZXRfZXhfYnl0ZXMgdmVyaWZ5X2dldF9leF91aW50NjQgdmVyaWZ5X2RlbGV0ZSB2ZXJpZnlfZXhpc3RzIHZlcmlmeV9wdXRfdWludDY0IHZlcmlmeV9wdXRfYnl0ZXMKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE9wdEluICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC5vcHRfaW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg2CiAgICAvLyBzZWxmLmxvY2FsX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gQnl0ZXMoYiJkdW1teV9ieXRlcyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlc3MgImxvY2FsX2J5dGVzIiAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMgLy8gImxvY2FsX2J5dGVzIiwgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg3CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OTkpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgcHVzaGludCA5OTkgLy8gOTk5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5MQogICAgLy8gdmFsdWUgPSBvcC5BcHBMb2NhbC5nZXRfYnl0ZXMoYSwgYikKICAgIGFwcF9sb2NhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2dldF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5NgogICAgLy8gdmFsdWUgPSBvcC5BcHBMb2NhbC5nZXRfdWludDY0KGEsIGIpCiAgICBhcHBfbG9jYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2dldF9leF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDEKICAgIC8vIHZhbHVlLCBfdmFsID0gb3AuQXBwTG9jYWwuZ2V0X2V4X2J5dGVzKGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2dldF9leF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2V4X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNgogICAgLy8gdmFsdWUsIF92YWwgPSBvcC5BcHBMb2NhbC5nZXRfZXhfdWludDY0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZGVsZXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2RlbGV0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxMQogICAgLy8gb3AuQXBwTG9jYWwuZGVsZXRlKGEsIGIpCiAgICBhcHBfbG9jYWxfZGVsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2V4aXN0c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leGlzdHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTUKICAgIC8vIF92YWx1ZSwgZXhpc3RzID0gb3AuQXBwTG9jYWwuZ2V0X2V4X3VpbnQ2NChhLCAwLCBiKQogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9wdXRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjAKICAgIC8vIG9wLkFwcExvY2FsLnB1dChhLCBiLCBjKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9wdXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyNAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOQogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhhODgzMDJmZSAweDQ5YjdkZGY5IDB4YzA3OGJlYWQgMHhhNTJmOTkyYiAweDhjNTZhZDkwIDB4NGM3YWQ4MjMgMHhjYWE3Yjg2NCAweDI0ZjlmMDg1IC8vIG1ldGhvZCAidmVyaWZ5X2dldF9ieXRlcyhhZGRyZXNzLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF9ieXRlcyhhZGRyZXNzLHVpbnQ2NCxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X2V4X3VpbnQ2NChhZGRyZXNzLHVpbnQ2NCxieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZGVsZXRlKGFkZHJlc3MsYnl0ZVtdKXZvaWQiLCBtZXRob2QgInZlcmlmeV9leGlzdHMoYWRkcmVzcyxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3B1dF91aW50NjQoYWRkcmVzcyxieXRlW10sdWludDY0KXZvaWQiLCBtZXRob2QgInZlcmlmeV9wdXRfYnl0ZXMoYWRkcmVzcyxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfZ2V0X2J5dGVzIHZlcmlmeV9nZXRfdWludDY0IHZlcmlmeV9nZXRfZXhfYnl0ZXMgdmVyaWZ5X2dldF9leF91aW50NjQgdmVyaWZ5X2RlbGV0ZSB2ZXJpZnlfZXhpc3RzIHZlcmlmeV9wdXRfdWludDY0IHZlcmlmeV9wdXRfYnl0ZXMKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE9wdEluICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0Lm9wdF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODYKICAgIC8vIHNlbGYubG9jYWxfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBCeXRlcyhiImR1bW15X2J5dGVzIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzcyAibG9jYWxfYnl0ZXMiIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MyAvLyAibG9jYWxfYnl0ZXMiLCAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODcKICAgIC8vIHNlbGYubG9jYWxfdWludDY0W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gVUludDY0KDk5OSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzICJsb2NhbF91aW50NjQiCiAgICBwdXNoaW50IDk5OSAvLyA5OTkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzkxCiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF9ieXRlcyhhLCBiKQogICAgYXBwX2xvY2FsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk2CiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF91aW50NjQoYSwgYikKICAgIGFwcF9sb2NhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdmFsdWUsIF92YWwgPSBvcC5BcHBMb2NhbC5nZXRfZXhfYnl0ZXMoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA2CiAgICAvLyB2YWx1ZSwgX3ZhbCA9IG9wLkFwcExvY2FsLmdldF9leF91aW50NjQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDExCiAgICAvLyBvcC5BcHBMb2NhbC5kZWxldGUoYSwgYikKICAgIGFwcF9sb2NhbF9kZWwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxNQogICAgLy8gX3ZhbHVlLCBleGlzdHMgPSBvcC5BcHBMb2NhbC5nZXRfZXhfdWludDY0KGEsIDAsIGIpCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI0CiAgICAvLyBvcC5BcHBMb2NhbC5wdXQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyACAQAmAQQVH3x1MRtBAF+ABDDG1Yo2GgCOAQBHMRkURDEYRIIIBKiDAv4ESbfd+QTAeL6tBKUvmSsEjFatkARMetgjBMqnuGQEJPnwhTYaAI4IAEcAXwBwAI0AowCvAMoA2gAxGSISMRgQREIACDEZFDEYFBBDMgmCAgtsb2NhbF9ieXRlcwtkdW1teV9ieXRlc2YyCYAMbG9jYWxfdWludDY0gecHZiJDNhoBNhoCVwIAYkkVFlcGAkxQKExQsCJDNhoBNhoCVwIAYhYoTFCwIkM2GgE2GgIXNhoDVwIAY0hJFRZXBgJMUChMULAiQzYaATYaAhc2GgNXAgBjSBYoTFCwIkM2GgE2GgJXAgBoIkM2GgE2GgJXAgAjTGNFAYABACNPAlQoTFCwIkM2GgE2GgJXAgA2GgMXZiJDNhoBNhoCVwIANhoDVwIAZiJD", + "approval": "CyACAQAmAQQVH3x1MRtBAF+ABDDG1Yo2GgCOAQBHMRkURDEYRIIIBKiDAv4ESbfd+QTAeL6tBKUvmSsEjFatkARMetgjBMqnuGQEJPnwhTYaAI4IAEkAYQByAI8ApQCxAMwA3AAxGSISMRgQREIACjEZFDEYFBBEIkMyCYICC2xvY2FsX2J5dGVzC2R1bW15X2J5dGVzZjIJgAxsb2NhbF91aW50NjSB5wdmIkM2GgE2GgJXAgBiSRUWVwYCTFAoTFCwIkM2GgE2GgJXAgBiFihMULAiQzYaATYaAhc2GgNXAgBjSEkVFlcGAkxQKExQsCJDNhoBNhoCFzYaA1cCAGNIFihMULAiQzYaATYaAlcCAGgiQzYaATYaAlcCACNMY0UBgAEAI08CVChMULAiQzYaATYaAlcCADYaAxdmIkM2GgE2GgJXAgA2GgNXAgBmIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal b/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal index b4b28e7..b3b750d 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal @@ -29,7 +29,9 @@ main___algopy_default_create@7: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + pushint 1 // 1 + return // tests.artifacts.StateOps.contract.StateAppLocalExContract.opt_in[routing]() -> void: diff --git a/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json b/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json index c818a92..0aa76cf 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json @@ -92,19 +92,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDYKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMSAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE9wdEluICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDc6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbEV4Q29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlc3MgImxvY2FsX2J5dGVzIiAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzM1ZjY2NzI2ZjZkNWY2NTc4NzQ2NTcyNmU2MTZjNWY2MzZmNmU3NDcyNjE2Mzc0IC8vICJsb2NhbF9ieXRlcyIsIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MzVmNjY3MjZmNmQ1ZjY1Nzg3NDY1NzI2ZTYxNmM1ZjYzNmY2ZTc0NzI2MTYzNzQKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjYKICAgIC8vIHNlbGYubG9jYWxfdWludDY0W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gVUludDY0KDk5KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBwdXNoYnl0ZXMgImxvY2FsX3VpbnQ2NCIKICAgIHB1c2hpbnQgOTkgLy8gOTkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjcKICAgIC8vIHNlbGYubG9jYWxfYXJjNF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2Ny0zNjkKICAgIC8vIHNlbGYubG9jYWxfYXJjNF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcygKICAgIC8vICAgICBiImR1bW15X2FyYzRfYnl0ZXMiCiAgICAvLyApCiAgICBwdXNoYnl0ZXNzICJsb2NhbF9hcmM0X2J5dGVzIiAweDAwMTA2NDc1NmQ2ZDc5NWY2MTcyNjMzNDVmNjI3OTc0NjU3MyAvLyAibG9jYWxfYXJjNF9ieXRlcyIsIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDYKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMSAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE9wdEluICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDc6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsRXhDb250cmFjdC5vcHRfaW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY1CiAgICAvLyBzZWxmLmxvY2FsX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gQnl0ZXMoYiJkdW1teV9ieXRlc19mcm9tX2V4dGVybmFsX2NvbnRyYWN0IikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzcyAibG9jYWxfYnl0ZXMiIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MzVmNjY3MjZmNmQ1ZjY1Nzg3NDY1NzI2ZTYxNmM1ZjYzNmY2ZTc0NzI2MTYzNzQgLy8gImxvY2FsX2J5dGVzIiwgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczNWY2NjcyNmY2ZDVmNjU3ODc0NjU3MjZlNjE2YzVmNjM2ZjZlNzQ3MjYxNjM3NAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NgogICAgLy8gc2VsZi5sb2NhbF91aW50NjRbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBVSW50NjQoOTkpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgcHVzaGludCA5OSAvLyA5OQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NwogICAgLy8gc2VsZi5sb2NhbF9hcmM0X2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKAogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY3LTM2OQogICAgLy8gc2VsZi5sb2NhbF9hcmM0X2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKAogICAgLy8gICAgIGIiZHVtbXlfYXJjNF9ieXRlcyIKICAgIC8vICkKICAgIHB1c2hieXRlc3MgImxvY2FsX2FyYzRfYnl0ZXMiIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczIC8vICJsb2NhbF9hcmM0X2J5dGVzIiwgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CzEbQQAagAQwxtWKNhoAjgEAAQAxGYEBEjEYEERCAAgxGRQxGBQQQzIJggILbG9jYWxfYnl0ZXMiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdGYyCYAMbG9jYWxfdWludDY0gWNmMgmCAhBsb2NhbF9hcmM0X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlc2aBAUM=", + "approval": "CzEbQQAagAQwxtWKNhoAjgEAAQAxGYEBEjEYEERCAAsxGRQxGBQQRIEBQzIJggILbG9jYWxfYnl0ZXMiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdGYyCYAMbG9jYWxfdWludDY0gWNmMgmCAhBsb2NhbF9hcmM0X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlc2aBAUM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal b/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal index ecf2086..009145d 100644 --- a/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal @@ -25,7 +25,9 @@ main___algopy_default_create@16: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.StateOps.contract.StateAppParamsContract.verify_app_params_get_approval_program[routing]() -> void: diff --git a/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json b/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json index 7df4304..46efe37 100644 --- a/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json @@ -240,6 +240,20 @@ ], "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, @@ -252,20 +266,6 @@ 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 +277,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGI5ZDEzYzFiIDB4ZTVjM2M4ODkgMHhlZTRlN2IyYSAweDdmYTIzNGNiIDB4MTlmNzc0MzkgMHg5MmM1NzJhYSAweGFlOWM2ZWZiIDB4ZTM2ZWQ3MDUgMHg4YzY2YTg0MiAvLyBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcyh1aW50NjQpYWRkcmVzcyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnQgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3OAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW1bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jbGVhcl9zdGF0ZV9wcm9ncmFtKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODQKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NsZWFyX3N0YXRlX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZ2xvYmFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzAwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV91aW50KF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2V4dHJhX3Byb2dyYW1fcGFnZXMoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyNAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZXh0cmFfcHJvZ3JhbV9wYWdlcyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jcmVhdG9yKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FkZHJlc3MoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9hZGRyZXNzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQyCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGI5ZDEzYzFiIDB4ZTVjM2M4ODkgMHhlZTRlN2IyYSAweDdmYTIzNGNiIDB4MTlmNzc0MzkgMHg5MmM1NzJhYSAweGFlOWM2ZWZiIDB4ZTM2ZWQ3MDUgMHg4YzY2YTg0MiAvLyBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcyh1aW50NjQpYWRkcmVzcyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnQgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FwcHJvdmFsX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfYXBwcm92YWxfcHJvZ3JhbShhKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQXBwcm92YWxQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3NgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfYXBwcm92YWxfcHJvZ3JhbShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjc4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NsZWFyX3N0YXRlX3Byb2dyYW0oYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENsZWFyU3RhdGVQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4NAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfY2xlYXJfc3RhdGVfcHJvZ3JhbShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENsZWFyU3RhdGVQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjg1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTEKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2dsb2JhbF9udW1fdWludChhKQogICAgYXBwX3BhcmFtc19nZXQgQXBwR2xvYmFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTIKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2dsb2JhbF9udW1fdWludChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV9ieXRlX3NsaWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk5CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2dsb2JhbF9udW1fYnl0ZV9zbGljZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwMQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzAyCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9sb2NhbF9udW1fdWludChhKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwOAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX2J5dGVfc2xpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxNQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX2J5dGVfc2xpY2UoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxNgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX2J5dGVfc2xpY2UoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzE4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2V4dHJhX3Byb2dyYW1fcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZXh0cmFfcHJvZ3JhbV9wYWdlcyhhKQogICAgYXBwX3BhcmFtc19nZXQgQXBwRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzI0CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9leHRyYV9wcm9ncmFtX3BhZ2VzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyNgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NyZWF0b3IoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jcmVhdG9yKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzMwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzM0CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfYWRkcmVzcyhhKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FkZHJlc3MoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDIKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyABASYBBBUffHUxG0EATjEZFEQxGESCCQS50TwbBOXDyIkE7k57KgR/ojTLBBn3dDkEksVyqgSunG77BONu1wUEjGaoQjYaAI4JAAkAKwBNAGgAgwCeALkA1ADuADEZFDEYFBBDNhoBF3IANhoBF3IASwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdyATYaARdyAUsDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcgI2GgEXcgJLA08CEkQSRBYoTFCwIkM2GgEXcgM2GgEXcgNLA08CEkQSRBYoTFCwIkM2GgEXcgQ2GgEXcgRLA08CEkQSRBYoTFCwIkM2GgEXcgU2GgEXcgVLA08CEkQSRBYoTFCwIkM2GgEXcgY2GgEXcgZLA08CEkQSRBYoTFCwIkM2GgEXcgc2GgEXcgdLA08CEkQSRChMULAiQzYaARdyCDYaARdyCEsDTwISRBJEKExQsCJD", + "approval": "CyABASYBBBUffHUxG0EATjEZFEQxGESCCQS50TwbBOXDyIkE7k57KgR/ojTLBBn3dDkEksVyqgSunG77BONu1wUEjGaoQjYaAI4JAAsALQBPAGoAhQCgALsA1gDwADEZFDEYFBBEIkM2GgEXcgA2GgEXcgBLA08CEkQSREkVFlcGAkxQKExQsCJDNhoBF3IBNhoBF3IBSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdyAjYaARdyAksDTwISRBJEFihMULAiQzYaARdyAzYaARdyA0sDTwISRBJEFihMULAiQzYaARdyBDYaARdyBEsDTwISRBJEFihMULAiQzYaARdyBTYaARdyBUsDTwISRBJEFihMULAiQzYaARdyBjYaARdyBksDTwISRBJEFihMULAiQzYaARdyBzYaARdyB0sDTwISRBJEKExQsCJDNhoBF3IINhoBF3IISwNPAhJEEkQoTFCwIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal b/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal index 3b359a4..7b3aae9 100644 --- a/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal @@ -24,7 +24,9 @@ main___algopy_default_create@9: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + pushint 1 // 1 + return // tests.artifacts.StateOps.contract.StateAssetHoldingContract.verify_asset_holding_get[routing]() -> void: diff --git a/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json b/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json index 9e6dd08..b7aacb0 100644 --- a/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json @@ -110,19 +110,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4ZjUyMzViNCAweGRlN2EzOWY2IC8vIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0KGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQoYWRkcmVzcyx1aW50NjQpYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9hc3NldF9ob2xkaW5nX2dldCB2ZXJpZnlfYXNzZXRfZnJvemVuX2dldAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdC52ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gYmFsYW5jZSwgX3ZhbCA9IG9wLkFzc2V0SG9sZGluZ0dldC5hc3NldF9iYWxhbmNlKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdC52ZXJpZnlfYXNzZXRfZnJvemVuX2dldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzAKICAgIC8vIGZyb3plbiwgX3ZhbCA9IG9wLkFzc2V0SG9sZGluZ0dldC5hc3NldF9mcm96ZW4oYSwgYikKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0RnJvemVuCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgcHVzaGludCAwIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4ZjUyMzViNCAweGRlN2EzOWY2IC8vIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0KGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQoYWRkcmVzcyx1aW50NjQpYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9hc3NldF9ob2xkaW5nX2dldCB2ZXJpZnlfYXNzZXRfZnJvemVuX2dldAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0SG9sZGluZ0NvbnRyYWN0LnZlcmlmeV9hc3NldF9ob2xkaW5nX2dldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9ob2xkaW5nX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTY1CiAgICAvLyBiYWxhbmNlLCBfdmFsID0gb3AuQXNzZXRIb2xkaW5nR2V0LmFzc2V0X2JhbGFuY2UoYSwgYikKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0SG9sZGluZ0NvbnRyYWN0LnZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gZnJvemVuLCBfdmFsID0gb3AuQXNzZXRIb2xkaW5nR2V0LmFzc2V0X2Zyb3plbihhLCBiKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRGcm96ZW4KICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBwdXNoaW50IDAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyYBBBUffHUxG0EAHTEZFEQxGESCAgSPUjW0BN56OfY2GgCOAgAJABsAMRkUMRgUEEM2GgE2GgIXcABIFihMULCBAUM2GgE2GgIXcAFIgAEAgQBPAlQoTFCwgQFD", + "approval": "CyYBBBUffHUxG0EAHTEZFEQxGESCAgSPUjW0BN56OfY2GgCOAgAMAB4AMRkUMRgUEESBAUM2GgE2GgIXcABIFihMULCBAUM2GgE2GgIXcAFIgAEAgQBPAlQoTFCwgQFD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal b/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal index 6f70159..a44a140 100644 --- a/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal @@ -25,7 +25,9 @@ main___algopy_default_create@19: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + assert // OnCompletion must be NoOp && can only call when creating + intc_0 // 1 + return // tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_total[routing]() -> void: diff --git a/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json b/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json index 2aa4f7f..17d8ff8 100644 --- a/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json @@ -303,6 +303,23 @@ ], "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, @@ -318,23 +335,6 @@ 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 +346,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzQKICAgIC8vIGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ZjA1ZGE3YTQgMHhjMGU5YzMxNSAweGQ4NTI4MjczIDB4ZjQ0NjhhZDkgMHgyMjlkMTJmNyAweGRmNTM0ZjdiIDB4ZTA1MGI1YTkgMHg4YjJhMmQ1OCAweGVlMTVjNGY3IDB4MTU3NTQ0ZmYgMHgxMDQ5MmMwNyAweDUyMjlmYTM3IC8vIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWwodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHModWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW4odWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybCh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tZXRhZGF0YV9oYXNoKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXIodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZSh1aW50NjQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2sodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IodWludDY0KWFkZHJlc3MiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbCB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFscyB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZSB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmwgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaCB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdG90YWwoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF90b3RhbChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgwCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVjaW1hbHMoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWNpbWFscyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVmYXVsdF9mcm96ZW4oYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWZhdWx0RnJvemVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2RlZmF1bHRfZnJvemVuKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBwdXNoaW50IDAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjAxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdW5pdF9uYW1lKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjAyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdW5pdF9uYW1lKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjAzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X25hbWUoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X25hbWUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxMQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEyCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdXJsKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxOAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VybChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVUkwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tZXRhZGF0YV9oYXNoW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjI1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWV0YWRhdGFfaGFzaChhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9tZXRhZGF0YV9oYXNoKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyNwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjI4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXJbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9tYW5hZ2VyKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWFuYWdlcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzQKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9tYW5hZ2VyKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDEKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9yZXNlcnZlKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDIKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9yZXNlcnZlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQ5CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZnJlZXplKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2ZyZWV6ZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRGcmVlemUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2s6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NsYXdiYWNrKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU4CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY2xhd2JhY2soX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jcmVhdG9yKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jcmVhdG9yKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzQKICAgIC8vIGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ZjA1ZGE3YTQgMHhjMGU5YzMxNSAweGQ4NTI4MjczIDB4ZjQ0NjhhZDkgMHgyMjlkMTJmNyAweGRmNTM0ZjdiIDB4ZTA1MGI1YTkgMHg4YjJhMmQ1OCAweGVlMTVjNGY3IDB4MTU3NTQ0ZmYgMHgxMDQ5MmMwNyAweDUyMjlmYTM3IC8vIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWwodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHModWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW4odWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybCh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tZXRhZGF0YV9oYXNoKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXIodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZSh1aW50NjQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2sodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IodWludDY0KWFkZHJlc3MiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbCB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFscyB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZSB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmwgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaCB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3RvdGFsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzcKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF90b3RhbChhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3RvdGFsKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWNpbWFscyhhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4NgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2RlY2ltYWxzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODgKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlZmF1bHRfZnJvemVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWZhdWx0X2Zyb3plbihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk0CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVmYXVsdF9mcm96ZW4oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVmYXVsdEZyb3plbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk2CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDEKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91bml0X25hbWUoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDIKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91bml0X25hbWUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjA5CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbmFtZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbmFtZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjExCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTIKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTcKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91cmwoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVUkwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE4CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdXJsKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjIwCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2hbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tZXRhZGF0YV9oYXNoOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9tZXRhZGF0YV9oYXNoKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWV0YWRhdGFIYXNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X21ldGFkYXRhX2hhc2goX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWV0YWRhdGFIYXNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X21hbmFnZXIoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X21hbmFnZXIoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWFuYWdlcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM2CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3Jlc2VydmUoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0MgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3Jlc2VydmUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQ0CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9mcmVlemUoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRGcmVlemUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZnJlZXplKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUyCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2tbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFjazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY2xhd2JhY2soYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDbGF3YmFjawogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jbGF3YmFjayhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDbGF3YmFjawogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjYwCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2NgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CyABASYBBBUffHUxG0EAYzEZFEQxGESCDATwXaekBMDpwxUE2FKCcwT0RorZBCKdEvcE31NPewTgULWpBIsqLVgE7hXE9wQVdUT/BBBJLAcEUin6NzYaAI4MAAkAJAA/AGEAgwClAMcA6QEDAR0BNwFRADEZFDEYFBBDNhoBF3EANhoBF3EASwNPAhJEEkQWKExQsCJDNhoBF3EBNhoBF3EBSwNPAhJEEkQWKExQsCJDNhoBF3ECNhoBF3ECSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARdxAzYaARdxA0sDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQQ2GgEXcQRLA08CEkQSREkVFlcGAkxQKExQsCJDNhoBF3EFNhoBF3EFSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdxBjYaARdxBksDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQc2GgEXcQdLA08CEkQSRChMULAiQzYaARdxCDYaARdxCEsDTwISRBJEKExQsCJDNhoBF3EJNhoBF3EJSwNPAhJEEkQoTFCwIkM2GgEXcQo2GgEXcQpLA08CEkQSRChMULAiQzYaARdxCzYaARdxC0sDTwISRBJEKExQsCJD", + "approval": "CyABASYBBBUffHUxG0EAYzEZFEQxGESCDATwXaekBMDpwxUE2FKCcwT0RorZBCKdEvcE31NPewTgULWpBIsqLVgE7hXE9wQVdUT/BBBJLAcEUin6NzYaAI4MAAsAJgBBAGMAhQCnAMkA6wEFAR8BOQFTADEZFDEYFBBEIkM2GgEXcQA2GgEXcQBLA08CEkQSRBYoTFCwIkM2GgEXcQE2GgEXcQFLA08CEkQSRBYoTFCwIkM2GgEXcQI2GgEXcQJLA08CEkQSRIABAIEATwJUKExQsCJDNhoBF3EDNhoBF3EDSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdxBDYaARdxBEsDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQU2GgEXcQVLA08CEkQSREkVFlcGAkxQKExQsCJDNhoBF3EGNhoBF3EGSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdxBzYaARdxB0sDTwISRBJEKExQsCJDNhoBF3EINhoBF3EISwNPAhJEEkQoTFCwIkM2GgEXcQk2GgEXcQlLA08CEkQSRChMULAiQzYaARdxCjYaARdxCksDTwISRBJEKExQsCJDNhoBF3ELNhoBF3ELSwNPAhJEEkQoTFCwIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [], diff --git a/tests/artifacts/Tuples/data/TuplesContract.approval.teal b/tests/artifacts/Tuples/data/TuplesContract.approval.teal index dd3673b..70c2eff 100644 --- a/tests/artifacts/Tuples/data/TuplesContract.approval.teal +++ b/tests/artifacts/Tuples/data/TuplesContract.approval.teal @@ -31,4 +31,6 @@ main___algopy_default_create@5: txn ApplicationID ! && - return // on error: OnCompletion must be NoOp && can only call when creating + 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 8e8b4c5..b5ac7c5 100644 --- a/tests/artifacts/Tuples/data/TuplesContract.arc56.json +++ b/tests/artifacts/Tuples/data/TuplesContract.arc56.json @@ -76,19 +76,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgVHVwbGVzQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg3MjI5ZDc5YSAvLyBtZXRob2QgInRlc3RfdHVwbGVfd2l0aF9wcmltaXRpdmVfdHlwZSgpKHVpbnQ2NCxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF90dXBsZV93aXRoX3ByaW1pdGl2ZV90eXBlX3JvdXRlQDMKICAgIGVycgoKbWFpbl90ZXN0X3R1cGxlX3dpdGhfcHJpbWl0aXZlX3R5cGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDAwMDAwMDAwMDAwMDAwODAKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgVHVwbGVzQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg3MjI5ZDc5YSAvLyBtZXRob2QgInRlc3RfdHVwbGVfd2l0aF9wcmltaXRpdmVfdHlwZSgpKHVpbnQ2NCxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF90dXBsZV93aXRoX3ByaW1pdGl2ZV90eXBlX3JvdXRlQDMKICAgIGVycgoKbWFpbl90ZXN0X3R1cGxlX3dpdGhfcHJpbWl0aXZlX3R5cGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDAwMDAwMDAwMDAwMDAwODAKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CzEbQQAogARyKdeaNhoAjgEAAQAxGRQxGBBEgA0VH3x1AAAAAAAAAACAsIEBQzEZFDEYFBBD", + "approval": "CzEbQQAogARyKdeaNhoAjgEAAQAxGRQxGBBEgA0VH3x1AAAAAAAAAACAsIEBQzEZFDEYFBBEgQFD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 0, - "patch": 0 + "minor": 3, + "patch": 1 } }, "events": [],