/* eslint-disable */ // @ts-nocheck /** * This file was automatically generated by @algorandfoundation/algokit-client-generator. * DO NOT MODIFY IT BY HAND. * requires: @algorandfoundation/algokit-utils: ^2 */ import * as algokit from '@algorandfoundation/algokit-utils' import type { ABIAppCallArg, AppCallTransactionResult, AppCallTransactionResultOfType, AppCompilationResult, AppReference, AppState, AppStorageSchema, CoreAppCallArgs, RawAppCallArgs, TealTemplateParams, } from '@algorandfoundation/algokit-utils/types/app' import type { AppClientCallCoreParams, AppClientCompilationParams, AppClientDeployCoreParams, AppDetails, ApplicationClient, } from '@algorandfoundation/algokit-utils/types/app-client' import type { AppSpec } from '@algorandfoundation/algokit-utils/types/app-spec' import type { SendTransactionResult, TransactionToSign, SendTransactionFrom, SendTransactionParams } from '@algorandfoundation/algokit-utils/types/transaction' import type { ABIResult, TransactionWithSigner } from 'algosdk' import { Algodv2, OnApplicationComplete, Transaction, AtomicTransactionComposer, modelsv2 } from 'algosdk' export const APP_SPEC: AppSpec = { "hints": { "arc200_name()byte[32]": { "call_config": { "no_op": "CALL" } }, "arc200_symbol()byte[8]": { "call_config": { "no_op": "CALL" } }, "arc200_decimals()uint8": { "call_config": { "no_op": "CALL" } }, "arc200_totalSupply()uint256": { "call_config": { "no_op": "CALL" } }, "arc200_balanceOf(address)uint256": { "call_config": { "no_op": "CALL" } }, "arc200_allowance(address,address)uint256": { "call_config": { "no_op": "CALL" } }, "arc200_transfer(address,uint256)bool": { "call_config": { "no_op": "CALL" } }, "arc200_approve(address,uint256)bool": { "call_config": { "no_op": "CALL" } }, "arc200_transferFrom(address,address,uint256)bool": { "call_config": { "no_op": "CALL" } }, "supportsInterface(byte[4])bool": { "call_config": { "no_op": "CALL" } }, "zeroAddress()address": { "call_config": { "no_op": "CALL" } }, "hasBox(address,address)bool": { "call_config": { "no_op": "CALL" } }, "createBalanceBox(address)bool": { "call_config": { "no_op": "CALL" } }, "createAllowanceBox(address,address)bool": { "call_config": { "no_op": "CALL" } }, "noop(uint64)void": { "call_config": { "no_op": "CALL" } }, "updateApplication()void": { "call_config": { "update_application": "CALL" } }, "deleteApplication()void": { "call_config": { "delete_application": "CALL" } }, "manager()address": { "call_config": { "no_op": "CALL" } }, "grant(address)void": { "call_config": { "no_op": "CALL" } }, "setFees(uint256)bool": { "call_config": { "no_op": "CALL" } }, "registerOnline(byte[],byte[],byte[],uint64,uint64,uint64)void": { "call_config": { "no_op": "CALL" } }, "registerOffline()void": { "call_config": { "no_op": "CALL" } }, "removeLiquidity(uint256)bool": { "call_config": { "no_op": "CALL" } }, "addLiquidity(txn,txn)bool": { "call_config": { "no_op": "CALL" } }, "swapAlphaToBeta(txn,uint256)uint256": { "call_config": { "no_op": "CALL" } }, "swapBetaToAlpha(txn,uint256)uint256": { "call_config": { "no_op": "CALL" } }, "createApplication(uint64,address,byte[32],byte[8],uint64,uint8,uint64,uint8,uint256)void": { "call_config": { "no_op": "CREATE" } }, "bootstrap()void": { "call_config": { "no_op": "CALL" } } }, "bare_call_config": { "no_op": "NEVER", "opt_in": "NEVER", "close_out": "NEVER", "update_application": "NEVER", "delete_application": "NEVER" }, "schema": { "local": { "declared": {}, "reserved": {} }, "global": { "declared": { "name": { "type": "bytes", "key": "name" }, "symbol": { "type": "bytes", "key": "symbol" }, "decimals": { "type": "bytes", "key": "decimals" }, "totalSupply": { "type": "bytes", "key": "total_supply" }, "initialized": { "type": "bytes", "key": "initialized" }, "warden": { "type": "bytes", "key": "warden" }, "factory": { "type": "uint64", "key": "factory" }, "alphaId": { "type": "uint64", "key": "alpha_id" }, "betaId": { "type": "uint64", "key": "beta_id" }, "alphaType": { "type": "bytes", "key": "alpha_type" }, "betaType": { "type": "bytes", "key": "beta_type" }, "swapFee": { "type": "bytes", "key": "swap_fee" } }, "reserved": {} } }, "state": { "global": { "num_byte_slices": 9, "num_uints": 3 }, "local": { "num_byte_slices": 0, "num_uints": 0 } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMi4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqY2FsbF9VcGRhdGVBcHBsaWNhdGlvbiAqY2FsbF9EZWxldGVBcHBsaWNhdGlvbiAqY3JlYXRlX05vT3AgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVECgoqTk9UX0lNUExFTUVOVEVEOgoJLy8gVGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgY29udHJhY3QuIEFyZSB5b3UgdXNpbmcgdGhlIGNvcnJlY3QgT25Db21wbGV0ZT8gRGlkIHlvdSBzZXQgeW91ciBhcHAgSUQ/CgllcnIKCi8vIGFyYzIwMF9uYW1lKClieXRlWzMyXQoqYWJpX3JvdXRlX2FyYzIwMF9uYW1lOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGFyYzIwMF9uYW1lKClieXRlWzMyXQoJY2FsbHN1YiBhcmMyMDBfbmFtZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFyYzIwMF9uYW1lKCk6IFN0YXRpY0J5dGVzPDMyPgphcmMyMDBfbmFtZToKCXByb3RvIDAgMQoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjI0CgkvLyByZXR1cm4gdGhpcy5uYW1lLnZhbHVlOwoJYnl0ZSAweDZlNjE2ZDY1IC8vICJuYW1lIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKLy8gYXJjMjAwX3N5bWJvbCgpYnl0ZVs4XQoqYWJpX3JvdXRlX2FyYzIwMF9zeW1ib2w6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGV4ZWN1dGUgYXJjMjAwX3N5bWJvbCgpYnl0ZVs4XQoJY2FsbHN1YiBhcmMyMDBfc3ltYm9sCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gYXJjMjAwX3N5bWJvbCgpOiBTdGF0aWNCeXRlczw4PgphcmMyMDBfc3ltYm9sOgoJcHJvdG8gMCAxCgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6MjkKCS8vIHJldHVybiB0aGlzLnN5bWJvbC52YWx1ZTsKCWJ5dGUgMHg3Mzc5NmQ2MjZmNmMgLy8gInN5bWJvbCIKCWFwcF9nbG9iYWxfZ2V0CglyZXRzdWIKCi8vIGFyYzIwMF9kZWNpbWFscygpdWludDgKKmFiaV9yb3V0ZV9hcmMyMDBfZGVjaW1hbHM6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGV4ZWN1dGUgYXJjMjAwX2RlY2ltYWxzKCl1aW50OAoJY2FsbHN1YiBhcmMyMDBfZGVjaW1hbHMKCWl0b2IKCWR1cAoJYml0bGVuCglpbnQgOAoJPD0KCgkvLyBhcmMyMDBfZGVjaW1hbHMgcmV0dXJuIHZhbHVlIG92ZXJmbG93ZWQgOCBiaXRzCglhc3NlcnQKCWV4dHJhY3QgNyAxCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gYXJjMjAwX2RlY2ltYWxzKCk6IHVpbnQ4CmFyYzIwMF9kZWNpbWFsczoKCXByb3RvIDAgMQoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjM0CgkvLyByZXR1cm4gdGhpcy5kZWNpbWFscy52YWx1ZTsKCWJ5dGUgMHg2NDY1NjM2OTZkNjE2YzczIC8vICJkZWNpbWFscyIKCWFwcF9nbG9iYWxfZ2V0CglidG9pCglyZXRzdWIKCi8vIGFyYzIwMF90b3RhbFN1cHBseSgpdWludDI1NgoqYWJpX3JvdXRlX2FyYzIwMF90b3RhbFN1cHBseToKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBhcmMyMDBfdG90YWxTdXBwbHkoKXVpbnQyNTYKCWNhbGxzdWIgYXJjMjAwX3RvdGFsU3VwcGx5CglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyBhcmMyMDBfdG90YWxTdXBwbHkgcmV0dXJuIHZhbHVlIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBhcmMyMDBfdG90YWxTdXBwbHkoKTogdWludDI1NgphcmMyMDBfdG90YWxTdXBwbHk6Cglwcm90byAwIDEKCgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czozOQoJLy8gcmV0dXJuIHRoaXMudG90YWxTdXBwbHkudmFsdWU7CglieXRlIDB4NzQ2Zjc0NjE2YzVmNzM3NTcwNzA2Yzc5IC8vICJ0b3RhbF9zdXBwbHkiCglhcHBfZ2xvYmFsX2dldAoJcmV0c3ViCgovLyBhcmMyMDBfYmFsYW5jZU9mKGFkZHJlc3MpdWludDI1NgoqYWJpX3JvdXRlX2FyYzIwMF9iYWxhbmNlT2Y6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIG93bmVyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG93bmVyKSBmb3IgYXJjMjAwX2JhbGFuY2VPZiBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhcmMyMDBfYmFsYW5jZU9mKGFkZHJlc3MpdWludDI1NgoJY2FsbHN1YiBhcmMyMDBfYmFsYW5jZU9mCglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyBhcmMyMDBfYmFsYW5jZU9mIHJldHVybiB2YWx1ZSBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gYXJjMjAwX2JhbGFuY2VPZihvd25lcjogQWRkcmVzcyk6IHVpbnQyNTYKYXJjMjAwX2JhbGFuY2VPZjoKCXByb3RvIDEgMQoKCS8vICppZjBfY29uZGl0aW9uCgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czo0NAoJLy8gdGhpcy5iYWxhbmNlcyhvd25lcikuZXhpc3RzCglmcmFtZV9kaWcgLTEgLy8gb3duZXI6IEFkZHJlc3MKCWJveF9sZW4KCXN3YXAKCXBvcAoJYnogKmlmMF9lbmQKCgkvLyAqaWYwX2NvbnNlcXVlbnQKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjQ1CgkvLyByZXR1cm4gdGhpcy5iYWxhbmNlcyhvd25lcikudmFsdWU7CglmcmFtZV9kaWcgLTEgLy8gb3duZXI6IEFkZHJlc3MKCWJveF9nZXQKCgkvLyBib3ggdmFsdWUgZG9lcyBub3QgZXhpc3Q6IHRoaXMuYmFsYW5jZXMob3duZXIpLnZhbHVlCglhc3NlcnQKCXJldHN1YgoKKmlmMF9lbmQ6CgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czo0NwoJLy8gcmV0dXJuIDx1aW50MjU2PjA7CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJcmV0c3ViCgovLyBhcmMyMDBfYWxsb3dhbmNlKGFkZHJlc3MsYWRkcmVzcyl1aW50MjU2CiphYmlfcm91dGVfYXJjMjAwX2FsbG93YW5jZToKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3BlbmRlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzcGVuZGVyKSBmb3IgYXJjMjAwX2FsbG93YW5jZSBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gb3duZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMSAob3duZXIpIGZvciBhcmMyMDBfYWxsb3dhbmNlIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGFyYzIwMF9hbGxvd2FuY2UoYWRkcmVzcyxhZGRyZXNzKXVpbnQyNTYKCWNhbGxzdWIgYXJjMjAwX2FsbG93YW5jZQoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9CgoJLy8gYXJjMjAwX2FsbG93YW5jZSByZXR1cm4gdmFsdWUgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFyYzIwMF9hbGxvd2FuY2Uob3duZXI6IEFkZHJlc3MsIHNwZW5kZXI6IEFkZHJlc3MpOiB1aW50MjU2CmFyYzIwMF9hbGxvd2FuY2U6Cglwcm90byAyIDEKCgkvLyAqaWYxX2NvbmRpdGlvbgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6NTIKCS8vIHRoaXMuYWxsb3dhbmNlcyhbb3duZXIsIHNwZW5kZXJdKS5leGlzdHMKCWZyYW1lX2RpZyAtMSAvLyBvd25lcjogQWRkcmVzcwoJZnJhbWVfZGlnIC0yIC8vIHNwZW5kZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCglieiAqaWYxX2VuZAoKCS8vICppZjFfY29uc2VxdWVudAoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6NTMKCS8vIHJldHVybiB0aGlzLmFsbG93YW5jZXMoW293bmVyLCBzcGVuZGVyXSkudmFsdWU7CglmcmFtZV9kaWcgLTEgLy8gb3duZXI6IEFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyBzcGVuZGVyOiBBZGRyZXNzCgljb25jYXQKCWJveF9nZXQKCgkvLyBib3ggdmFsdWUgZG9lcyBub3QgZXhpc3Q6IHRoaXMuYWxsb3dhbmNlcyhbb3duZXIsIHNwZW5kZXJdKS52YWx1ZQoJYXNzZXJ0CglyZXRzdWIKCippZjFfZW5kOgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6NTUKCS8vIHJldHVybiA8dWludDI1Nj4wOwoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCXJldHN1YgoKLy8gdHJhbnNmZXIoZnJvbTogQWRkcmVzcywgdG86IEFkZHJlc3MsIHZhbHVlOiB1aW50MjU2KTogYm9vbGVhbgp0cmFuc2ZlcjoKCXByb3RvIDMgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gKmlmMl9jb25kaXRpb24KCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjYzCgkvLyAhdGhpcy5iYWxhbmNlcyhmcm9tKS5leGlzdHMgJiYgZnJvbS5iYWxhbmNlID49IGdsb2JhbHMubWluQmFsYW5jZQoJZnJhbWVfZGlnIC0xIC8vIGZyb206IEFkZHJlc3MKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJZHVwCglieiAqc2tpcF9hbmQwCglmcmFtZV9kaWcgLTEgLy8gZnJvbTogQWRkcmVzcwoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCglwb3AKCWdsb2JhbCBNaW5CYWxhbmNlCgk+PQoJJiYKCipza2lwX2FuZDA6CglieiAqaWYyX2VuZAoKCS8vICppZjJfY29uc2VxdWVudAoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6NjQKCS8vIHRoaXMuYmFsYW5jZXMoZnJvbSkudmFsdWUgPSA8dWludDI1Nj4wCglmcmFtZV9kaWcgLTEgLy8gZnJvbTogQWRkcmVzcwoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCWJveF9wdXQKCippZjJfZW5kOgoJLy8gKmlmM19jb25kaXRpb24KCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjY2CgkvLyAhdGhpcy5iYWxhbmNlcyh0bykuZXhpc3RzICYmIHRvLmJhbGFuY2UgPj0gZ2xvYmFscy5taW5CYWxhbmNlCglmcmFtZV9kaWcgLTIgLy8gdG86IEFkZHJlc3MKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJZHVwCglieiAqc2tpcF9hbmQxCglmcmFtZV9kaWcgLTIgLy8gdG86IEFkZHJlc3MKCWFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQoJcG9wCglnbG9iYWwgTWluQmFsYW5jZQoJPj0KCSYmCgoqc2tpcF9hbmQxOgoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjY3CgkvLyB0aGlzLmJhbGFuY2VzKHRvKS52YWx1ZSA9IDx1aW50MjU2PjAKCWZyYW1lX2RpZyAtMiAvLyB0bzogQWRkcmVzcwoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCWJveF9wdXQKCippZjNfZW5kOgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6NzAKCS8vIGFzc2VydCh0aGlzLmJhbGFuY2VzKGZyb20pLmV4aXN0cywgTk9UX0VOT1VHSF9CQUxBTkNFKQoJZnJhbWVfZGlnIC0xIC8vIGZyb206IEFkZHJlc3MKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIG5vdCBlbm91Z2ggYmFsYW5jZQoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6NzEKCS8vIGFzc2VydCh0aGlzLmJhbGFuY2VzKHRvKS5leGlzdHMsIEVNUFRZX1dBTExFVCkKCWZyYW1lX2RpZyAtMiAvLyB0bzogQWRkcmVzcwoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gZW1wdHkgd2FsbGV0LCBtdXN0IGhvbGQgbWluQmFsYW5jZQoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6NzMKCS8vIHNlbmRlckJhbGFuY2UgPSB0aGlzLmJhbGFuY2VzKGZyb20pLnZhbHVlCglmcmFtZV9kaWcgLTEgLy8gZnJvbTogQWRkcmVzcwoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5iYWxhbmNlcyhmcm9tKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDAgLy8gc2VuZGVyQmFsYW5jZTogdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjc0CgkvLyBhc3NlcnQoc2VuZGVyQmFsYW5jZSA+PSB2YWx1ZSwgTk9UX0VOT1VHSF9CQUxBTkNFKQoJZnJhbWVfZGlnIDAgLy8gc2VuZGVyQmFsYW5jZTogdWludDI1NgoJZnJhbWVfZGlnIC0zIC8vIHZhbHVlOiB1aW50MjU2CgliPj0KCgkvLyBub3QgZW5vdWdoIGJhbGFuY2UKCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjc2CgkvLyB0aGlzLmJhbGFuY2VzKGZyb20pLnZhbHVlID0gc2VuZGVyQmFsYW5jZSAtIHZhbHVlCglmcmFtZV9kaWcgLTEgLy8gZnJvbTogQWRkcmVzcwoJZnJhbWVfZGlnIDAgLy8gc2VuZGVyQmFsYW5jZTogdWludDI1NgoJZnJhbWVfZGlnIC0zIC8vIHZhbHVlOiB1aW50MjU2CgliLQoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9CgoJLy8gc2VuZGVyQmFsYW5jZSAtIHZhbHVlIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWJveF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czo3NwoJLy8gdGhpcy5iYWxhbmNlcyh0bykudmFsdWUgPSB0aGlzLmJhbGFuY2VzKHRvKS52YWx1ZSArIHZhbHVlCglmcmFtZV9kaWcgLTIgLy8gdG86IEFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB0bzogQWRkcmVzcwoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5iYWxhbmNlcyh0bykudmFsdWUKCWFzc2VydAoJZnJhbWVfZGlnIC0zIC8vIHZhbHVlOiB1aW50MjU2CgliKwoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9CgoJLy8gdGhpcy5iYWxhbmNlcyh0bykudmFsdWUgKyB2YWx1ZSBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCglib3hfcHV0CgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6NzkKCS8vIHRoaXMuYXJjMjAwX1RyYW5zZmVyLmxvZyh7IGZyb206IGZyb20sIHRvOiB0bywgdmFsdWU6IHZhbHVlIH0pCglieXRlIDB4Nzk4M2MzNWMgLy8gYXJjMjAwX1RyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2KQoJZnJhbWVfZGlnIC0xIC8vIGZyb206IEFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB0bzogQWRkcmVzcwoJY29uY2F0CglmcmFtZV9kaWcgLTMgLy8gdmFsdWU6IHVpbnQyNTYKCWNvbmNhdAoJY29uY2F0Cglsb2cKCgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czo4MQoJLy8gcmV0dXJuIHRydWU7CglpbnQgMQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBhcmMyMDBfdHJhbnNmZXIoYWRkcmVzcyx1aW50MjU2KWJvb2wKKmFiaV9yb3V0ZV9hcmMyMDBfdHJhbnNmZXI6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbHVlOiB1aW50MjU2Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHZhbHVlKSBmb3IgYXJjMjAwX3RyYW5zZmVyIG11c3QgYmUgYSB1aW50MjU2Cglhc3NlcnQKCgkvLyB0bzogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAxICh0bykgZm9yIGFyYzIwMF90cmFuc2ZlciBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhcmMyMDBfdHJhbnNmZXIoYWRkcmVzcyx1aW50MjU2KWJvb2wKCWNhbGxzdWIgYXJjMjAwX3RyYW5zZmVyCglieXRlIDB4MDAKCWludCAwCgl1bmNvdmVyIDIKCXNldGJpdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFyYzIwMF90cmFuc2Zlcih0bzogQWRkcmVzcywgdmFsdWU6IHVpbnQyNTYpOiBib29sZWFuCmFyYzIwMF90cmFuc2ZlcjoKCXByb3RvIDIgMQoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjg1CgkvLyByZXR1cm4gdGhpcy50cmFuc2Zlcih0aGlzLnR4bi5zZW5kZXIsIHRvLCB2YWx1ZSk7CglmcmFtZV9kaWcgLTIgLy8gdmFsdWU6IHVpbnQyNTYKCWZyYW1lX2RpZyAtMSAvLyB0bzogQWRkcmVzcwoJdHhuIFNlbmRlcgoJY2FsbHN1YiB0cmFuc2ZlcgoJcmV0c3ViCgovLyBhcHByb3ZlKG93bmVyOiBBZGRyZXNzLCBzcGVuZGVyOiBBZGRyZXNzLCB2YWx1ZTogdWludDI1Nik6IGJvb2xlYW4KYXBwcm92ZToKCXByb3RvIDMgMQoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjg5CgkvLyBhc3NlcnQodGhpcy5hbGxvd2FuY2VzKFtvd25lciwgc3BlbmRlcl0pLmV4aXN0cyB8fCBzcGVuZGVyLmJhbGFuY2UgPj0gZ2xvYmFscy5taW5CYWxhbmNlLCBFTVBUWV9XQUxMRVQpCglmcmFtZV9kaWcgLTEgLy8gb3duZXI6IEFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyBzcGVuZGVyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJZHVwCglibnogKnNraXBfb3IwCglmcmFtZV9kaWcgLTIgLy8gc3BlbmRlcjogQWRkcmVzcwoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCglwb3AKCWdsb2JhbCBNaW5CYWxhbmNlCgk+PQoJfHwKCipza2lwX29yMDoKCS8vIGVtcHR5IHdhbGxldCwgbXVzdCBob2xkIG1pbkJhbGFuY2UKCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjkxCgkvLyB0aGlzLmFsbG93YW5jZXMoW293bmVyLCBzcGVuZGVyXSkudmFsdWUgPSB2YWx1ZQoJZnJhbWVfZGlnIC0xIC8vIG93bmVyOiBBZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gc3BlbmRlcjogQWRkcmVzcwoJY29uY2F0CglmcmFtZV9kaWcgLTMgLy8gdmFsdWU6IHVpbnQyNTYKCWJveF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czo5MgoJLy8gdGhpcy5hcmMyMDBfQXBwcm92YWwubG9nKHsgb3duZXI6IG93bmVyLCBzcGVuZGVyOiBzcGVuZGVyLCB2YWx1ZTogdmFsdWUgfSkKCWJ5dGUgMHgxOTY5Zjg2NSAvLyBhcmMyMDBfQXBwcm92YWwoYWRkcmVzcyxhZGRyZXNzLHVpbnQyNTYpCglmcmFtZV9kaWcgLTEgLy8gb3duZXI6IEFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyBzcGVuZGVyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyB2YWx1ZTogdWludDI1NgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjk0CgkvLyByZXR1cm4gdHJ1ZTsKCWludCAxCglyZXRzdWIKCi8vIGFyYzIwMF9hcHByb3ZlKGFkZHJlc3MsdWludDI1Nilib29sCiphYmlfcm91dGVfYXJjMjAwX2FwcHJvdmU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbHVlOiB1aW50MjU2Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHZhbHVlKSBmb3IgYXJjMjAwX2FwcHJvdmUgbXVzdCBiZSBhIHVpbnQyNTYKCWFzc2VydAoKCS8vIHNwZW5kZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMSAoc3BlbmRlcikgZm9yIGFyYzIwMF9hcHByb3ZlIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGFyYzIwMF9hcHByb3ZlKGFkZHJlc3MsdWludDI1Nilib29sCgljYWxsc3ViIGFyYzIwMF9hcHByb3ZlCglieXRlIDB4MDAKCWludCAwCgl1bmNvdmVyIDIKCXNldGJpdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFyYzIwMF9hcHByb3ZlKHNwZW5kZXI6IEFkZHJlc3MsIHZhbHVlOiB1aW50MjU2KTogYm9vbGVhbgphcmMyMDBfYXBwcm92ZToKCXByb3RvIDIgMQoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjk4CgkvLyByZXR1cm4gdGhpcy5hcHByb3ZlKHRoaXMudHhuLnNlbmRlciwgc3BlbmRlciwgdmFsdWUpOwoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlOiB1aW50MjU2CglmcmFtZV9kaWcgLTEgLy8gc3BlbmRlcjogQWRkcmVzcwoJdHhuIFNlbmRlcgoJY2FsbHN1YiBhcHByb3ZlCglyZXRzdWIKCi8vIGFyYzIwMF90cmFuc2ZlckZyb20oYWRkcmVzcyxhZGRyZXNzLHVpbnQyNTYpYm9vbAoqYWJpX3JvdXRlX2FyYzIwMF90cmFuc2ZlckZyb206CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbHVlOiB1aW50MjU2Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHZhbHVlKSBmb3IgYXJjMjAwX3RyYW5zZmVyRnJvbSBtdXN0IGJlIGEgdWludDI1NgoJYXNzZXJ0CgoJLy8gdG86IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMSAodG8pIGZvciBhcmMyMDBfdHJhbnNmZXJGcm9tIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBmcm9tOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDIgKGZyb20pIGZvciBhcmMyMDBfdHJhbnNmZXJGcm9tIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGFyYzIwMF90cmFuc2ZlckZyb20oYWRkcmVzcyxhZGRyZXNzLHVpbnQyNTYpYm9vbAoJY2FsbHN1YiBhcmMyMDBfdHJhbnNmZXJGcm9tCglieXRlIDB4MDAKCWludCAwCgl1bmNvdmVyIDIKCXNldGJpdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFyYzIwMF90cmFuc2ZlckZyb20oZnJvbTogQWRkcmVzcywgdG86IEFkZHJlc3MsIHZhbHVlOiB1aW50MjU2KTogYm9vbGVhbgphcmMyMDBfdHJhbnNmZXJGcm9tOgoJcHJvdG8gMyAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cAoKCS8vICppZjRfY29uZGl0aW9uCgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czoxMDIKCS8vIHZhbHVlID09PSAwCglmcmFtZV9kaWcgLTMgLy8gdmFsdWU6IHVpbnQyNTYKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCgliPT0KCWJ6ICppZjRfZW5kCgoJLy8gKmlmNF9jb25zZXF1ZW50CgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czoxMDIKCS8vIHJldHVybiB0cnVlOwoJaW50IDEKCWIgKmFyYzIwMF90cmFuc2ZlckZyb20qcmV0dXJuCgoqaWY0X2VuZDoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjEwNAoJLy8gYWxsb3dhbmNlID0gdGhpcy5hcmMyMDBfYWxsb3dhbmNlKGZyb20sIHRoaXMudHhuLnNlbmRlcikKCXR4biBTZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBmcm9tOiBBZGRyZXNzCgljYWxsc3ViIGFyYzIwMF9hbGxvd2FuY2UKCWZyYW1lX2J1cnkgMCAvLyBhbGxvd2FuY2U6IHVuc2FmZSB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6MTA1CgkvLyBhc3NlcnQoYWxsb3dhbmNlID49IHZhbHVlLCBBTExPV0FOQ0VfSU5TVUZGSUNJRU5UKQoJZnJhbWVfZGlnIDAgLy8gYWxsb3dhbmNlOiB1bnNhZmUgdWludDI1NgoJZnJhbWVfZGlnIC0zIC8vIHZhbHVlOiB1aW50MjU2CgliPj0KCgkvLyBjYW4ndCBzcGVuZCBtb3JlIHRoYW4gYWxsb3dlZAoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6MTA3CgkvLyBvd25lckJhbGFuY2UgPSB0aGlzLmFyYzIwMF9iYWxhbmNlT2YoZnJvbSkKCWZyYW1lX2RpZyAtMSAvLyBmcm9tOiBBZGRyZXNzCgljYWxsc3ViIGFyYzIwMF9iYWxhbmNlT2YKCWZyYW1lX2J1cnkgMSAvLyBvd25lckJhbGFuY2U6IHVuc2FmZSB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6MTA4CgkvLyBhc3NlcnQob3duZXJCYWxhbmNlID49IHZhbHVlLCBOT1RfRU5PVUdIX0JBTEFOQ0UpCglmcmFtZV9kaWcgMSAvLyBvd25lckJhbGFuY2U6IHVuc2FmZSB1aW50MjU2CglmcmFtZV9kaWcgLTMgLy8gdmFsdWU6IHVpbnQyNTYKCWI+PQoKCS8vIG5vdCBlbm91Z2ggYmFsYW5jZQoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6MTEwCgkvLyB0aGlzLmFsbG93YW5jZXMoW2Zyb20sIHRoaXMudHhuLnNlbmRlcl0pLnZhbHVlID0gYWxsb3dhbmNlIC0gdmFsdWUKCWZyYW1lX2RpZyAtMSAvLyBmcm9tOiBBZGRyZXNzCgl0eG4gU2VuZGVyCgljb25jYXQKCWZyYW1lX2RpZyAwIC8vIGFsbG93YW5jZTogdW5zYWZlIHVpbnQyNTYKCWZyYW1lX2RpZyAtMyAvLyB2YWx1ZTogdWludDI1NgoJYi0KCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIGFsbG93YW5jZSAtIHZhbHVlIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWJveF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czoxMTEKCS8vIHRoaXMuYmFsYW5jZXMoZnJvbSkudmFsdWUgPSBvd25lckJhbGFuY2UgLSB2YWx1ZQoJZnJhbWVfZGlnIC0xIC8vIGZyb206IEFkZHJlc3MKCWZyYW1lX2RpZyAxIC8vIG93bmVyQmFsYW5jZTogdW5zYWZlIHVpbnQyNTYKCWZyYW1lX2RpZyAtMyAvLyB2YWx1ZTogdWludDI1NgoJYi0KCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIG93bmVyQmFsYW5jZSAtIHZhbHVlIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWJveF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czoxMTIKCS8vIHRoaXMuYmFsYW5jZXModG8pLnZhbHVlID0gdGhpcy5hcmMyMDBfYmFsYW5jZU9mKHRvKSArIHZhbHVlCglmcmFtZV9kaWcgLTIgLy8gdG86IEFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB0bzogQWRkcmVzcwoJY2FsbHN1YiBhcmMyMDBfYmFsYW5jZU9mCglmcmFtZV9kaWcgLTMgLy8gdmFsdWU6IHVpbnQyNTYKCWIrCglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyB0aGlzLmFyYzIwMF9iYWxhbmNlT2YodG8pICsgdmFsdWUgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJYm94X3B1dAoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjExNAoJLy8gdGhpcy5hcmMyMDBfVHJhbnNmZXIubG9nKHsgZnJvbTogZnJvbSwgdG86IHRvLCB2YWx1ZTogdmFsdWUgfSkKCWJ5dGUgMHg3OTgzYzM1YyAvLyBhcmMyMDBfVHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQyNTYpCglmcmFtZV9kaWcgLTEgLy8gZnJvbTogQWRkcmVzcwoJZnJhbWVfZGlnIC0yIC8vIHRvOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyB2YWx1ZTogdWludDI1NgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjExNgoJLy8gcmV0dXJuIHRydWU7CglpbnQgMQoKKmFyYzIwMF90cmFuc2ZlckZyb20qcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMQoJcmV0c3ViCgovLyBzdXBwb3J0c0ludGVyZmFjZShieXRlWzRdKWJvb2wKKmFiaV9yb3V0ZV9zdXBwb3J0c0ludGVyZmFjZToKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gaW50ZXJmYWNlSUQ6IGJ5dGVbNF0KCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgNAoJPT0KCgkvLyBhcmd1bWVudCAwIChpbnRlcmZhY2VJRCkgZm9yIHN1cHBvcnRzSW50ZXJmYWNlIG11c3QgYmUgYSBieXRlWzRdCglhc3NlcnQKCgkvLyBleGVjdXRlIHN1cHBvcnRzSW50ZXJmYWNlKGJ5dGVbNF0pYm9vbAoJY2FsbHN1YiBzdXBwb3J0c0ludGVyZmFjZQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBzdXBwb3J0c0ludGVyZmFjZShpbnRlcmZhY2VJRDogU3RhdGljQXJyYXk8Ynl0ZSwgND4pOiBib29sZWFuCnN1cHBvcnRzSW50ZXJmYWNlOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czoxMjEKCS8vIGlkID0gYnRvaShpbnRlcmZhY2VJRCkKCWZyYW1lX2RpZyAtMSAvLyBpbnRlcmZhY2VJRDogU3RhdGljQXJyYXk8Ynl0ZSwgND4KCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBpZDogdWludDY0CgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6MTIzCgkvLyByZXR1cm4gKAoJLy8gICAgICAgaWQgPT09IDB4NGUyMmEzYmEgfHwKCS8vICAgICAgIGlkID09PSAweGM3YmVhMDQwIHx8CgkvLyAgICAgICBpZCA9PT0gMHhkYTcwMjViOSB8fAoJLy8gICAgICAgaWQgPT09IDB4NGE5NjhmOGYgfHwKCS8vICAgICAgIGlkID09PSAweGI1NDIyMTI1IHx8CgkvLyAgICAgICBpZCA9PT0gMHg2NTdkMTNlYyB8fAoJLy8gICAgICAgaWQgPT09IDB4YjZhZTFhMjUgfHwKCS8vICAgICAgIGlkID09PSAweDg0ZWMxM2Q1IHx8CgkvLyAgICAgICBpZCA9PT0gMHhlYzk5NjA0MSB8fAoJLy8gICAgICAgaWQgPT09IDB4ODJlNTczYzQgfHwKCS8vICAgICAgIGlkID09PSAweGJiYjMxOWYzIHx8CgkvLyAgICAgICBpZCA9PT0gMHg3OTgzYzM1YyB8fAoJLy8gICAgICAgaWQgPT09IDB4MTk2OWY4NjUgfHwKCS8vICAgICAgIGlkID09PSAweGJjNGE1NDAwIHx8CgkvLyAgICAgICBpZCA9PT0gMHhjOThkZDA1NSB8fAoJLy8gICAgICAgaWQgPT09IDB4NjYzMDQyZmIKCS8vICAgICApOwoJZnJhbWVfZGlnIDAgLy8gaWQ6IHVpbnQ2NAoJaW50IDB4NGUyMmEzYmEKCT09CglkdXAKCWJueiAqc2tpcF9vcjEKCWZyYW1lX2RpZyAwIC8vIGlkOiB1aW50NjQKCWludCAweGM3YmVhMDQwCgk9PQoJfHwKCipza2lwX29yMToKCWR1cAoJYm56ICpza2lwX29yMgoJZnJhbWVfZGlnIDAgLy8gaWQ6IHVpbnQ2NAoJaW50IDB4ZGE3MDI1YjkKCT09Cgl8fAoKKnNraXBfb3IyOgoJZHVwCglibnogKnNraXBfb3IzCglmcmFtZV9kaWcgMCAvLyBpZDogdWludDY0CglpbnQgMHg0YTk2OGY4ZgoJPT0KCXx8Cgoqc2tpcF9vcjM6CglkdXAKCWJueiAqc2tpcF9vcjQKCWZyYW1lX2RpZyAwIC8vIGlkOiB1aW50NjQKCWludCAweGI1NDIyMTI1Cgk9PQoJfHwKCipza2lwX29yNDoKCWR1cAoJYm56ICpza2lwX29yNQoJZnJhbWVfZGlnIDAgLy8gaWQ6IHVpbnQ2NAoJaW50IDB4NjU3ZDEzZWMKCT09Cgl8fAoKKnNraXBfb3I1OgoJZHVwCglibnogKnNraXBfb3I2CglmcmFtZV9kaWcgMCAvLyBpZDogdWludDY0CglpbnQgMHhiNmFlMWEyNQoJPT0KCXx8Cgoqc2tpcF9vcjY6CglkdXAKCWJueiAqc2tpcF9vcjcKCWZyYW1lX2RpZyAwIC8vIGlkOiB1aW50NjQKCWludCAweDg0ZWMxM2Q1Cgk9PQoJfHwKCipza2lwX29yNzoKCWR1cAoJYm56ICpza2lwX29yOAoJZnJhbWVfZGlnIDAgLy8gaWQ6IHVpbnQ2NAoJaW50IDB4ZWM5OTYwNDEKCT09Cgl8fAoKKnNraXBfb3I4OgoJZHVwCglibnogKnNraXBfb3I5CglmcmFtZV9kaWcgMCAvLyBpZDogdWludDY0CglpbnQgMHg4MmU1NzNjNAoJPT0KCXx8Cgoqc2tpcF9vcjk6CglkdXAKCWJueiAqc2tpcF9vcjEwCglmcmFtZV9kaWcgMCAvLyBpZDogdWludDY0CglpbnQgMHhiYmIzMTlmMwoJPT0KCXx8Cgoqc2tpcF9vcjEwOgoJZHVwCglibnogKnNraXBfb3IxMQoJZnJhbWVfZGlnIDAgLy8gaWQ6IHVpbnQ2NAoJaW50IDB4Nzk4M2MzNWMKCT09Cgl8fAoKKnNraXBfb3IxMToKCWR1cAoJYm56ICpza2lwX29yMTIKCWZyYW1lX2RpZyAwIC8vIGlkOiB1aW50NjQKCWludCAweDE5NjlmODY1Cgk9PQoJfHwKCipza2lwX29yMTI6CglkdXAKCWJueiAqc2tpcF9vcjEzCglmcmFtZV9kaWcgMCAvLyBpZDogdWludDY0CglpbnQgMHhiYzRhNTQwMAoJPT0KCXx8Cgoqc2tpcF9vcjEzOgoJZHVwCglibnogKnNraXBfb3IxNAoJZnJhbWVfZGlnIDAgLy8gaWQ6IHVpbnQ2NAoJaW50IDB4Yzk4ZGQwNTUKCT09Cgl8fAoKKnNraXBfb3IxNDoKCWR1cAoJYm56ICpza2lwX29yMTUKCWZyYW1lX2RpZyAwIC8vIGlkOiB1aW50NjQKCWludCAweDY2MzA0MmZiCgk9PQoJfHwKCipza2lwX29yMTU6CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gemVyb0FkZHJlc3MoKWFkZHJlc3MKKmFiaV9yb3V0ZV96ZXJvQWRkcmVzczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSB6ZXJvQWRkcmVzcygpYWRkcmVzcwoJY2FsbHN1YiB6ZXJvQWRkcmVzcwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHplcm9BZGRyZXNzKCk6IEFkZHJlc3MKemVyb0FkZHJlc3M6Cglwcm90byAwIDEKCgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czoxNDUKCS8vIHJldHVybiBnbG9iYWxzLnplcm9BZGRyZXNzOwoJZ2xvYmFsIFplcm9BZGRyZXNzCglyZXRzdWIKCi8vIGhhc0JveChhZGRyZXNzLGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2hhc0JveDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3BlbmRlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzcGVuZGVyKSBmb3IgaGFzQm94IG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBvd25lcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAxIChvd25lcikgZm9yIGhhc0JveCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBoYXNCb3goYWRkcmVzcyxhZGRyZXNzKWJvb2wKCWNhbGxzdWIgaGFzQm94CglieXRlIDB4MDAKCWludCAwCgl1bmNvdmVyIDIKCXNldGJpdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGhhc0JveChvd25lcjogQWRkcmVzcywgc3BlbmRlcjogQWRkcmVzcyk6IGJvb2xlYW4KaGFzQm94OgoJcHJvdG8gMiAxCgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjE1MAoJLy8gc3BlbmRlciA9PT0gZ2xvYmFscy56ZXJvQWRkcmVzcwoJZnJhbWVfZGlnIC0yIC8vIHNwZW5kZXI6IEFkZHJlc3MKCWdsb2JhbCBaZXJvQWRkcmVzcwoJPT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czoxNTEKCS8vIHJldHVybiB0aGlzLmJhbGFuY2VzKG93bmVyKS5leGlzdHM7CglmcmFtZV9kaWcgLTEgLy8gb3duZXI6IEFkZHJlc3MKCWJveF9sZW4KCXN3YXAKCXBvcAoJcmV0c3ViCgoqaWY1X2VuZDoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjE1MwoJLy8gcmV0dXJuIHRoaXMuYWxsb3dhbmNlcyhbb3duZXIsIHNwZW5kZXJdKS5leGlzdHM7CglmcmFtZV9kaWcgLTEgLy8gb3duZXI6IEFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyBzcGVuZGVyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJcmV0c3ViCgovLyBjcmVhdGVCYWxhbmNlQm94KGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2NyZWF0ZUJhbGFuY2VCb3g6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIG93bmVyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG93bmVyKSBmb3IgY3JlYXRlQmFsYW5jZUJveCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBjcmVhdGVCYWxhbmNlQm94KGFkZHJlc3MpYm9vbAoJY2FsbHN1YiBjcmVhdGVCYWxhbmNlQm94CglieXRlIDB4MDAKCWludCAwCgl1bmNvdmVyIDIKCXNldGJpdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGNyZWF0ZUJhbGFuY2VCb3gob3duZXI6IEFkZHJlc3MpOiBib29sZWFuCmNyZWF0ZUJhbGFuY2VCb3g6Cglwcm90byAxIDEKCgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvQXJjMjAwLmFsZ28udHM6MTU3CgkvLyAhdGhpcy5iYWxhbmNlcyhvd25lcikuZXhpc3RzCglmcmFtZV9kaWcgLTEgLy8gb3duZXI6IEFkZHJlc3MKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmNl9lbmQKCgkvLyAqaWY2X2NvbnNlcXVlbnQKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjE1OAoJLy8gdGhpcy5iYWxhbmNlcyhvd25lcikudmFsdWUgPSA8dWludDI1Nj4wCglmcmFtZV9kaWcgLTEgLy8gb3duZXI6IEFkZHJlc3MKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCglib3hfcHV0CgoqaWY2X2VuZDoKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjE2MAoJLy8gcmV0dXJuIHRydWU7CglpbnQgMQoJcmV0c3ViCgovLyBjcmVhdGVBbGxvd2FuY2VCb3goYWRkcmVzcyxhZGRyZXNzKWJvb2wKKmFiaV9yb3V0ZV9jcmVhdGVBbGxvd2FuY2VCb3g6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHNwZW5kZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAoc3BlbmRlcikgZm9yIGNyZWF0ZUFsbG93YW5jZUJveCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gb3duZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMSAob3duZXIpIGZvciBjcmVhdGVBbGxvd2FuY2VCb3ggbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIGV4ZWN1dGUgY3JlYXRlQWxsb3dhbmNlQm94KGFkZHJlc3MsYWRkcmVzcylib29sCgljYWxsc3ViIGNyZWF0ZUFsbG93YW5jZUJveAoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBjcmVhdGVBbGxvd2FuY2VCb3gob3duZXI6IEFkZHJlc3MsIHNwZW5kZXI6IEFkZHJlc3MpOiBib29sZWFuCmNyZWF0ZUFsbG93YW5jZUJveDoKCXByb3RvIDIgMQoKCS8vICppZjdfY29uZGl0aW9uCgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czoxNjQKCS8vICF0aGlzLmFsbG93YW5jZXMoW293bmVyLCBzcGVuZGVyXSkuZXhpc3RzCglmcmFtZV9kaWcgLTEgLy8gb3duZXI6IEFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyBzcGVuZGVyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmN19lbmQKCgkvLyAqaWY3X2NvbnNlcXVlbnQKCS8vIHNyYy9jb250cmFjdHMvbGliL0FyYzIwMC5hbGdvLnRzOjE2NQoJLy8gdGhpcy5hbGxvd2FuY2VzKFtvd25lciwgc3BlbmRlcl0pLnZhbHVlID0gPHVpbnQyNTY+MAoJZnJhbWVfZGlnIC0xIC8vIG93bmVyOiBBZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gc3BlbmRlcjogQWRkcmVzcwoJY29uY2F0CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYm94X3B1dAoKKmlmN19lbmQ6CgkvLyBzcmMvY29udHJhY3RzL2xpYi9BcmMyMDAuYWxnby50czoxNjcKCS8vIHJldHVybiB0cnVlOwoJaW50IDEKCXJldHN1YgoKLy8gbm9vcCh1aW50NjQpdm9pZAoqYWJpX3JvdXRlX25vb3A6CgkvLyBfbjogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBub29wKHVpbnQ2NCl2b2lkCgljYWxsc3ViIG5vb3AKCWludCAxCglyZXR1cm4KCi8vIG5vb3AoX246IHVpbnQ2NCk6IHZvaWQKbm9vcDoKCXByb3RvIDEgMAoJcmV0c3ViCgovLyB1cGRhdGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX3VwZGF0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSB1cGRhdGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiB1cGRhdGVBcHBsaWNhdGlvbgoJaW50IDEKCXJldHVybgoKLy8gdXBkYXRlQXBwbGljYXRpb24oKTogdm9pZAp1cGRhdGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIHNyYy9jb250cmFjdHMvbGliL093bmFibGUuYWxnby50czo3CgkvLyBhc3NlcnQodGhpcy53YXJkZW4uZXhpc3RzLCAndGhpcyBhcHAgY2FuIG5vdCB1cGRhdGUnKQoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYnl0ZSAweDc3NjE3MjY0NjU2ZSAvLyAid2FyZGVuIgoJYXBwX2dsb2JhbF9nZXRfZXgKCXN3YXAKCXBvcAoKCS8vIHRoaXMgYXBwIGNhbiBub3QgdXBkYXRlCglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL2xpYi9Pd25hYmxlLmFsZ28udHM6OAoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gdGhpcy53YXJkZW4udmFsdWUsICdvbmx5IG1hbmFnZXIgY2FuIHVwZGF0ZScpCgl0eG4gU2VuZGVyCglieXRlIDB4Nzc2MTcyNjQ2NTZlIC8vICJ3YXJkZW4iCglhcHBfZ2xvYmFsX2dldAoJPT0KCgkvLyBvbmx5IG1hbmFnZXIgY2FuIHVwZGF0ZQoJYXNzZXJ0CglyZXRzdWIKCi8vIGRlbGV0ZUFwcGxpY2F0aW9uKCl2b2lkCiphYmlfcm91dGVfZGVsZXRlQXBwbGljYXRpb246CgkvLyBleGVjdXRlIGRlbGV0ZUFwcGxpY2F0aW9uKCl2b2lkCgljYWxsc3ViIGRlbGV0ZUFwcGxpY2F0aW9uCglpbnQgMQoJcmV0dXJuCgovLyBkZWxldGVBcHBsaWNhdGlvbigpOiB2b2lkCmRlbGV0ZUFwcGxpY2F0aW9uOgoJcHJvdG8gMCAwCgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvT3duYWJsZS5hbGdvLnRzOjEyCgkvLyBhc3NlcnQodGhpcy53YXJkZW4uZXhpc3RzLCAndGhpcyBhcHAgY2FuIG5vdCBiZSBkZWxldGVkJykKCXR4bmEgQXBwbGljYXRpb25zIDAKCWJ5dGUgMHg3NzYxNzI2NDY1NmUgLy8gIndhcmRlbiIKCWFwcF9nbG9iYWxfZ2V0X2V4Cglzd2FwCglwb3AKCgkvLyB0aGlzIGFwcCBjYW4gbm90IGJlIGRlbGV0ZWQKCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvbGliL093bmFibGUuYWxnby50czoxMwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gdGhpcy53YXJkZW4udmFsdWUsICdvbmx5IG1hbmFnZXIgY2FuIGRlbGV0ZScpCgl0eG4gU2VuZGVyCglieXRlIDB4Nzc2MTcyNjQ2NTZlIC8vICJ3YXJkZW4iCglhcHBfZ2xvYmFsX2dldAoJPT0KCgkvLyBvbmx5IG1hbmFnZXIgY2FuIGRlbGV0ZQoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvT3duYWJsZS5hbGdvLnRzOjE0CgkvLyBzZW5kUGF5bWVudCh7CgkvLyAgICAgICBhbW91bnQ6IDAsCgkvLyAgICAgICBzZW5kZXI6IHRoaXMuYXBwLmFkZHJlc3MsCgkvLyAgICAgICByZWNlaXZlcjogdGhpcy53YXJkZW4udmFsdWUsCgkvLyAgICAgICBjbG9zZVJlbWFpbmRlclRvOiB0aGlzLndhcmRlbi52YWx1ZSwKCS8vICAgICAgIHJla2V5VG86IHRoaXMud2FyZGVuLnZhbHVlLAoJLy8gICAgICAgZmVlOiBnbG9iYWxzLm1pblR4bkZlZSwKCS8vICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IHBheQoJaXR4bl9maWVsZCBUeXBlRW51bQoKCS8vIHNyYy9jb250cmFjdHMvbGliL093bmFibGUuYWxnby50czoxNQoJLy8gYW1vdW50OiAwCglpbnQgMAoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBzcmMvY29udHJhY3RzL2xpYi9Pd25hYmxlLmFsZ28udHM6MTYKCS8vIHNlbmRlcjogdGhpcy5hcHAuYWRkcmVzcwoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWl0eG5fZmllbGQgU2VuZGVyCgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvT3duYWJsZS5hbGdvLnRzOjE3CgkvLyByZWNlaXZlcjogdGhpcy53YXJkZW4udmFsdWUKCWJ5dGUgMHg3NzYxNzI2NDY1NmUgLy8gIndhcmRlbiIKCWFwcF9nbG9iYWxfZ2V0CglpdHhuX2ZpZWxkIFJlY2VpdmVyCgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvT3duYWJsZS5hbGdvLnRzOjE4CgkvLyBjbG9zZVJlbWFpbmRlclRvOiB0aGlzLndhcmRlbi52YWx1ZQoJYnl0ZSAweDc3NjE3MjY0NjU2ZSAvLyAid2FyZGVuIgoJYXBwX2dsb2JhbF9nZXQKCWl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwoKCS8vIHNyYy9jb250cmFjdHMvbGliL093bmFibGUuYWxnby50czoxOQoJLy8gcmVrZXlUbzogdGhpcy53YXJkZW4udmFsdWUKCWJ5dGUgMHg3NzYxNzI2NDY1NmUgLy8gIndhcmRlbiIKCWFwcF9nbG9iYWxfZ2V0CglpdHhuX2ZpZWxkIFJla2V5VG8KCgkvLyBzcmMvY29udHJhY3RzL2xpYi9Pd25hYmxlLmFsZ28udHM6MjAKCS8vIGZlZTogZ2xvYmFscy5taW5UeG5GZWUKCWdsb2JhbCBNaW5UeG5GZWUKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJcmV0c3ViCgovLyBtYW5hZ2VyKClhZGRyZXNzCiphYmlfcm91dGVfbWFuYWdlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBtYW5hZ2VyKClhZGRyZXNzCgljYWxsc3ViIG1hbmFnZXIKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBtYW5hZ2VyKCk6IEFkZHJlc3MKbWFuYWdlcjoKCXByb3RvIDAgMQoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBzcmMvY29udHJhY3RzL2xpYi9Pd25hYmxlLmFsZ28udHM6MjYKCS8vIHRoaXMud2FyZGVuLmV4aXN0cwoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYnl0ZSAweDc3NjE3MjY0NjU2ZSAvLyAid2FyZGVuIgoJYXBwX2dsb2JhbF9nZXRfZXgKCXN3YXAKCXBvcAoJYnogKmlmOF9lbmQKCgkvLyAqaWY4X2NvbnNlcXVlbnQKCS8vIHNyYy9jb250cmFjdHMvbGliL093bmFibGUuYWxnby50czoyNwoJLy8gcmV0dXJuIHRoaXMud2FyZGVuLnZhbHVlOwoJYnl0ZSAweDc3NjE3MjY0NjU2ZSAvLyAid2FyZGVuIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKKmlmOF9lbmQ6CgkvLyBzcmMvY29udHJhY3RzL2xpYi9Pd25hYmxlLmFsZ28udHM6MjkKCS8vIHJldHVybiBnbG9iYWxzLnplcm9BZGRyZXNzOwoJZ2xvYmFsIFplcm9BZGRyZXNzCglyZXRzdWIKCi8vIGdyYW50KGFkZHJlc3Mpdm9pZAoqYWJpX3JvdXRlX2dyYW50OgoJLy8gbWFuYWdlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChtYW5hZ2VyKSBmb3IgZ3JhbnQgbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIGV4ZWN1dGUgZ3JhbnQoYWRkcmVzcyl2b2lkCgljYWxsc3ViIGdyYW50CglpbnQgMQoJcmV0dXJuCgovLyBncmFudChtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZApncmFudDoKCXByb3RvIDEgMAoKCS8vIHNyYy9jb250cmFjdHMvbGliL093bmFibGUuYWxnby50czozMwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gdGhpcy53YXJkZW4udmFsdWUsICd1bmF1dGhvcml6ZWQnKQoJdHhuIFNlbmRlcgoJYnl0ZSAweDc3NjE3MjY0NjU2ZSAvLyAid2FyZGVuIgoJYXBwX2dsb2JhbF9nZXQKCT09CgoJLy8gdW5hdXRob3JpemVkCglhc3NlcnQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvT3duYWJsZS5hbGdvLnRzOjM0CgkvLyBtYW5hZ2VyID09PSBnbG9iYWxzLnplcm9BZGRyZXNzCglmcmFtZV9kaWcgLTEgLy8gbWFuYWdlcjogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgk9PQoJYnogKmlmOV9lbHNlCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBzcmMvY29udHJhY3RzL2xpYi9Pd25hYmxlLmFsZ28udHM6MzUKCS8vIHRoaXMud2FyZGVuLmRlbGV0ZSgpCglieXRlIDB4Nzc2MTcyNjQ2NTZlIC8vICJ3YXJkZW4iCglhcHBfZ2xvYmFsX2RlbAoJYiAqaWY5X2VuZAoKKmlmOV9lbHNlOgoJLy8gc3JjL2NvbnRyYWN0cy9saWIvT3duYWJsZS5hbGdvLnRzOjM3CgkvLyB0aGlzLndhcmRlbi52YWx1ZSA9IG1hbmFnZXIKCWJ5dGUgMHg3NzYxNzI2NDY1NmUgLy8gIndhcmRlbiIKCWZyYW1lX2RpZyAtMSAvLyBtYW5hZ2VyOiBBZGRyZXNzCglhcHBfZ2xvYmFsX3B1dAoKKmlmOV9lbmQ6CglyZXRzdWIKCi8vIHNldEZlZXModWludDI1Nilib29sCiphYmlfcm91dGVfc2V0RmVlczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZmVlOiB1aW50MjU2Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGZlZSkgZm9yIHNldEZlZXMgbXVzdCBiZSBhIHVpbnQyNTYKCWFzc2VydAoKCS8vIGV4ZWN1dGUgc2V0RmVlcyh1aW50MjU2KWJvb2wKCWNhbGxzdWIgc2V0RmVlcwoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBzZXRGZWVzKGZlZTogdWludDI1Nik6IGJvb2xlYW4Kc2V0RmVlczoKCXByb3RvIDEgMQoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMS5hbGdvLnRzOjQxCgkvLyBhc3NlcnQodGhpcy53YXJkZW4udmFsdWUgPT09IHRoaXMudHhuLnNlbmRlcikKCWJ5dGUgMHg3NzYxNzI2NDY1NmUgLy8gIndhcmRlbiIKCWFwcF9nbG9iYWxfZ2V0Cgl0eG4gU2VuZGVyCgk9PQoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDExLmFsZ28udHM6NDIKCS8vIHRoaXMuc3dhcEZlZS52YWx1ZSA9IGZlZQoJYnl0ZSAweDczNzc2MTcwNWY2NjY1NjUgLy8gInN3YXBfZmVlIgoJZnJhbWVfZGlnIC0xIC8vIGZlZTogdWludDI1NgoJYXBwX2dsb2JhbF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTEuYWxnby50czo0MwoJLy8gcmV0dXJuIHRydWU7CglpbnQgMQoJcmV0c3ViCgovLyByZWdpc3Rlck9ubGluZShieXRlW10sYnl0ZVtdLGJ5dGVbXSx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfcmVnaXN0ZXJPbmxpbmU6CgkvLyB2b3RlS2V5RGlsdXRpb246IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJYnRvaQoKCS8vIHZvdGVMYXN0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWJ0b2kKCgkvLyB2b3RlRmlyc3Q6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJYnRvaQoKCS8vIHZvdGVQazogYnl0ZVtdCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIHN0YXRlUHJvb2ZQazogYnl0ZVtdCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglleHRyYWN0IDIgMAoKCS8vIHNlbGVjdGlvblBrOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgoJLy8gZXhlY3V0ZSByZWdpc3Rlck9ubGluZShieXRlW10sYnl0ZVtdLGJ5dGVbXSx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIHJlZ2lzdGVyT25saW5lCglpbnQgMQoJcmV0dXJuCgovLyByZWdpc3Rlck9ubGluZShzZWxlY3Rpb25QazogYnl0ZXMsIHN0YXRlUHJvb2ZQazogYnl0ZXMsIHZvdGVQazogYnl0ZXMsIHZvdGVGaXJzdDogdWludDY0LCB2b3RlTGFzdDogdWludDY0LCB2b3RlS2V5RGlsdXRpb246IHVpbnQ2NCk6IHZvaWQKcmVnaXN0ZXJPbmxpbmU6Cglwcm90byA2IDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMS5hbGdvLnRzOjU0CgkvLyBmYWN0b3J5TWFuYWdlciA9IHRoaXMuZmFjdG9yeS52YWx1ZS5nbG9iYWxTdGF0ZSgnd2FyZGVuJykgYXMgQWRkcmVzcwoJYnl0ZSAweDY2NjE2Mzc0NmY3Mjc5IC8vICJmYWN0b3J5IgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHg3NzYxNzI2NDY1NmUgLy8gIndhcmRlbiIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLmZhY3RvcnkudmFsdWUuZ2xvYmFsU3RhdGUoJ3dhcmRlbicpCglhc3NlcnQKCWZyYW1lX2J1cnkgMCAvLyBmYWN0b3J5TWFuYWdlcjogYWRkcmVzcwoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMS5hbGdvLnRzOjU1CgkvLyBhc3NlcnQodGhpcy50eG4uc2VuZGVyID09PSB0aGlzLndhcmRlbi52YWx1ZSB8fCB0aGlzLnR4bi5zZW5kZXIgPT09IGZhY3RvcnlNYW5hZ2VyKQoJdHhuIFNlbmRlcgoJYnl0ZSAweDc3NjE3MjY0NjU2ZSAvLyAid2FyZGVuIgoJYXBwX2dsb2JhbF9nZXQKCT09CglkdXAKCWJueiAqc2tpcF9vcjE2Cgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgMCAvLyBmYWN0b3J5TWFuYWdlcjogYWRkcmVzcwoJPT0KCXx8Cgoqc2tpcF9vcjE2OgoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDExLmFsZ28udHM6NTcKCS8vIHNlbmRPbmxpbmVLZXlSZWdpc3RyYXRpb24oewoJLy8gICAgICAgc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzLAoJLy8gICAgICAgc2VsZWN0aW9uUEs6IHNlbGVjdGlvblBrLAoJLy8gICAgICAgc3RhdGVQcm9vZlBLOiBzdGF0ZVByb29mUGssCgkvLyAgICAgICB2b3RlUEs6IHZvdGVQaywKCS8vICAgICAgIHZvdGVGaXJzdDogdm90ZUZpcnN0LAoJLy8gICAgICAgdm90ZUxhc3Q6IHZvdGVMYXN0LAoJLy8gICAgICAgdm90ZUtleURpbHV0aW9uOiB2b3RlS2V5RGlsdXRpb24sCgkvLyAgICAgICBmZWU6IGdsb2JhbHMubWluVHhuRmVlLAoJLy8gICAgIH0pCglpdHhuX2JlZ2luCglpbnQga2V5cmVnCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDExLmFsZ28udHM6NTgKCS8vIHNlbmRlcjogdGhpcy5hcHAuYWRkcmVzcwoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWl0eG5fZmllbGQgU2VuZGVyCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDExLmFsZ28udHM6NTkKCS8vIHNlbGVjdGlvblBLOiBzZWxlY3Rpb25QawoJZnJhbWVfZGlnIC0xIC8vIHNlbGVjdGlvblBrOiBieXRlcwoJaXR4bl9maWVsZCBTZWxlY3Rpb25QSwoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMS5hbGdvLnRzOjYwCgkvLyBzdGF0ZVByb29mUEs6IHN0YXRlUHJvb2ZQawoJZnJhbWVfZGlnIC0yIC8vIHN0YXRlUHJvb2ZQazogYnl0ZXMKCWl0eG5fZmllbGQgU3RhdGVQcm9vZlBLCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDExLmFsZ28udHM6NjEKCS8vIHZvdGVQSzogdm90ZVBrCglmcmFtZV9kaWcgLTMgLy8gdm90ZVBrOiBieXRlcwoJaXR4bl9maWVsZCBWb3RlUEsKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTEuYWxnby50czo2MgoJLy8gdm90ZUZpcnN0OiB2b3RlRmlyc3QKCWZyYW1lX2RpZyAtNCAvLyB2b3RlRmlyc3Q6IHVpbnQ2NAoJaXR4bl9maWVsZCBWb3RlRmlyc3QKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTEuYWxnby50czo2MwoJLy8gdm90ZUxhc3Q6IHZvdGVMYXN0CglmcmFtZV9kaWcgLTUgLy8gdm90ZUxhc3Q6IHVpbnQ2NAoJaXR4bl9maWVsZCBWb3RlTGFzdAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMS5hbGdvLnRzOjY0CgkvLyB2b3RlS2V5RGlsdXRpb246IHZvdGVLZXlEaWx1dGlvbgoJZnJhbWVfZGlnIC02IC8vIHZvdGVLZXlEaWx1dGlvbjogdWludDY0CglpdHhuX2ZpZWxkIFZvdGVLZXlEaWx1dGlvbgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMS5hbGdvLnRzOjY1CgkvLyBmZWU6IGdsb2JhbHMubWluVHhuRmVlCglnbG9iYWwgTWluVHhuRmVlCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCXJldHN1YgoKLy8gcmVnaXN0ZXJPZmZsaW5lKCl2b2lkCiphYmlfcm91dGVfcmVnaXN0ZXJPZmZsaW5lOgoJLy8gZXhlY3V0ZSByZWdpc3Rlck9mZmxpbmUoKXZvaWQKCWNhbGxzdWIgcmVnaXN0ZXJPZmZsaW5lCglpbnQgMQoJcmV0dXJuCgovLyByZWdpc3Rlck9mZmxpbmUoKTogdm9pZApyZWdpc3Rlck9mZmxpbmU6Cglwcm90byAwIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMS5hbGdvLnRzOjcwCgkvLyBmYWN0b3J5TWFuYWdlciA9IHRoaXMuZmFjdG9yeS52YWx1ZS5nbG9iYWxTdGF0ZSgnd2FyZGVuJykgYXMgQWRkcmVzcwoJYnl0ZSAweDY2NjE2Mzc0NmY3Mjc5IC8vICJmYWN0b3J5IgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHg3NzYxNzI2NDY1NmUgLy8gIndhcmRlbiIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLmZhY3RvcnkudmFsdWUuZ2xvYmFsU3RhdGUoJ3dhcmRlbicpCglhc3NlcnQKCWZyYW1lX2J1cnkgMCAvLyBmYWN0b3J5TWFuYWdlcjogYWRkcmVzcwoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMS5hbGdvLnRzOjcxCgkvLyBhc3NlcnQodGhpcy50eG4uc2VuZGVyID09PSB0aGlzLndhcmRlbi52YWx1ZSB8fCB0aGlzLnR4bi5zZW5kZXIgPT09IGZhY3RvcnlNYW5hZ2VyKQoJdHhuIFNlbmRlcgoJYnl0ZSAweDc3NjE3MjY0NjU2ZSAvLyAid2FyZGVuIgoJYXBwX2dsb2JhbF9nZXQKCT09CglkdXAKCWJueiAqc2tpcF9vcjE3Cgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgMCAvLyBmYWN0b3J5TWFuYWdlcjogYWRkcmVzcwoJPT0KCXx8Cgoqc2tpcF9vcjE3OgoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDExLmFsZ28udHM6NzMKCS8vIHNlbmRPZmZsaW5lS2V5UmVnaXN0cmF0aW9uKHsKCS8vICAgICAgIHNlbmRlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgIGZlZTogZ2xvYmFscy5taW5UeG5GZWUsCgkvLyAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBrZXlyZWcKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTEuYWxnby50czo3NAoJLy8gc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJaXR4bl9maWVsZCBTZW5kZXIKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTEuYWxnby50czo3NQoJLy8gZmVlOiBnbG9iYWxzLm1pblR4bkZlZQoJZ2xvYmFsIE1pblR4bkZlZQoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglyZXRzdWIKCi8vIGdldEFsZ29CYWxhbmNlKGFkZHJlc3M6IEFkZHJlc3MpOiB1aW50MjU2CmdldEFsZ29CYWxhbmNlOgoJcHJvdG8gMSAxCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6NgoJLy8gcmV0dXJuIDx1aW50MjU2PihhZGRyZXNzLmJhbGFuY2UgLSBhZGRyZXNzLm1pbkJhbGFuY2UpOwoJZnJhbWVfZGlnIC0xIC8vIGFkZHJlc3M6IEFkZHJlc3MKCWFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgLTEgLy8gYWRkcmVzczogQWRkcmVzcwoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglwb3AKCS0KCWl0b2IKCXJldHN1YgoKLy8gZ2V0QXNhQmFsYW5jZShhZGRyZXNzOiBBZGRyZXNzLCBhc3NldElkOiB1aW50NjQpOiB1aW50MjU2CmdldEFzYUJhbGFuY2U6Cglwcm90byAyIDEKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czoxMAoJLy8gcmV0dXJuIDx1aW50MjU2PmFkZHJlc3MuYXNzZXRCYWxhbmNlKGFzc2V0SWQpOwoJZnJhbWVfZGlnIC0xIC8vIGFkZHJlc3M6IEFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyBhc3NldElkOiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglpdG9iCglyZXRzdWIKCi8vIGdldFNtYXJ0QXNzZXRCYWxhbmNlKGFkZHJlc3M6IEFkZHJlc3MsIGFzc2V0SWQ6IHVpbnQ2NCk6IHVpbnQyNTYKZ2V0U21hcnRBc3NldEJhbGFuY2U6Cglwcm90byAyIDEKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czoxNAoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtBZGRyZXNzXSwgdWludDI1Nj4oewoJLy8gICAgICAgICAgICAgc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzLAoJLy8gICAgICAgICAgICAgbmFtZTogJ2FyYzIwMF9iYWxhbmNlT2YnLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NChhc3NldElkKSwKCS8vICAgICAgICAgICAgIG1ldGhvZEFyZ3M6IFthZGRyZXNzXSwKCS8vICAgICAgICAgICAgIGZlZTogZ2xvYmFscy5taW5UeG5GZWUsCgkvLyAgICAgICAgIH0pOwoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYXJjMjAwX2JhbGFuY2VPZihhZGRyZXNzKXVpbnQyNTYiCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjE1CgkvLyBzZW5kZXI6IHRoaXMuYXBwLmFkZHJlc3MKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCglpdHhuX2ZpZWxkIFNlbmRlcgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjE3CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KGFzc2V0SWQpCglmcmFtZV9kaWcgLTIgLy8gYXNzZXRJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czoxOAoJLy8gbWV0aG9kQXJnczogW2FkZHJlc3NdCglmcmFtZV9kaWcgLTEgLy8gYWRkcmVzczogQWRkcmVzcwoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czoxOQoJLy8gZmVlOiBnbG9iYWxzLm1pblR4bkZlZQoJZ2xvYmFsIE1pblR4bkZlZQoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCXJldHN1YgoKLy8gdHJhbnNmZXJBbGdvVG8odG86IEFkZHJlc3MsIGFtb3VudDogdWludDI1Nik6IGJvb2xlYW4KdHJhbnNmZXJBbGdvVG86Cglwcm90byAyIDEKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czoyNAoJLy8gc2VuZFBheW1lbnQoewoJLy8gICAgICAgICAgICAgc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzLAoJLy8gICAgICAgICAgICAgcmVjZWl2ZXI6IHRvLAoJLy8gICAgICAgICAgICAgYW1vdW50OiA8dWludDY0PmFtb3VudCwKCS8vICAgICAgICAgICAgIGZlZTogZ2xvYmFscy5taW5UeG5GZWUsCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MjUKCS8vIHNlbmRlcjogdGhpcy5hcHAuYWRkcmVzcwoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWl0eG5fZmllbGQgU2VuZGVyCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MjYKCS8vIHJlY2VpdmVyOiB0bwoJZnJhbWVfZGlnIC0xIC8vIHRvOiBBZGRyZXNzCglpdHhuX2ZpZWxkIFJlY2VpdmVyCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MjcKCS8vIGFtb3VudDogPHVpbnQ2ND5hbW91bnQKCWZyYW1lX2RpZyAtMiAvLyBhbW91bnQ6IHVpbnQyNTYKCWR1cAoJYml0bGVuCglpbnQgNjQKCTw9CgoJLy8gPHVpbnQ2ND5hbW91bnQgb3ZlcmZsb3dlZCA2NCBiaXRzCglhc3NlcnQKCWV4dHJhY3QgMjQgOAoJYnRvaQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czoyOAoJLy8gZmVlOiBnbG9iYWxzLm1pblR4bkZlZQoJZ2xvYmFsIE1pblR4bkZlZQoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MzAKCS8vIHJldHVybiB0cnVlOwoJaW50IDEKCXJldHN1YgoKLy8gdHJhbnNmZXJBc2FUbyh0bzogQWRkcmVzcywgYW1vdW50OiB1aW50MjU2LCBhc3NldElkOiB1aW50NjQpOiBib29sZWFuCnRyYW5zZmVyQXNhVG86Cglwcm90byAzIDEKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czozNAoJLy8gc2VuZEFzc2V0VHJhbnNmZXIoewoJLy8gICAgICAgICAgICAgc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzLAoJLy8gICAgICAgICAgICAgYXNzZXRBbW91bnQ6IDx1aW50NjQ+YW1vdW50LAoJLy8gICAgICAgICAgICAgYXNzZXRSZWNlaXZlcjogdG8sCgkvLyAgICAgICAgICAgICB4ZmVyQXNzZXQ6IEFzc2V0SUQuZnJvbVVpbnQ2NChhc3NldElkKSwKCS8vICAgICAgICAgICAgIGZlZTogZ2xvYmFscy5taW5UeG5GZWUsCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXhmZXIKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czozNQoJLy8gc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJaXR4bl9maWVsZCBTZW5kZXIKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czozNgoJLy8gYXNzZXRBbW91bnQ6IDx1aW50NjQ+YW1vdW50CglmcmFtZV9kaWcgLTIgLy8gYW1vdW50OiB1aW50MjU2CglkdXAKCWJpdGxlbgoJaW50IDY0Cgk8PQoKCS8vIDx1aW50NjQ+YW1vdW50IG92ZXJmbG93ZWQgNjQgYml0cwoJYXNzZXJ0CglleHRyYWN0IDI0IDgKCWJ0b2kKCWl0eG5fZmllbGQgQXNzZXRBbW91bnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czozNwoJLy8gYXNzZXRSZWNlaXZlcjogdG8KCWZyYW1lX2RpZyAtMSAvLyB0bzogQWRkcmVzcwoJaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MzgKCS8vIHhmZXJBc3NldDogQXNzZXRJRC5mcm9tVWludDY0KGFzc2V0SWQpCglmcmFtZV9kaWcgLTMgLy8gYXNzZXRJZDogdWludDY0CglpdHhuX2ZpZWxkIFhmZXJBc3NldAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjM5CgkvLyBmZWU6IGdsb2JhbHMubWluVHhuRmVlCglnbG9iYWwgTWluVHhuRmVlCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo0MQoJLy8gcmV0dXJuIHRydWU7CglpbnQgMQoJcmV0c3ViCgovLyB0cmFuc2ZlclNtYXJ0QXNzZXRUbyh0bzogQWRkcmVzcywgYW1vdW50OiB1aW50MjU2LCBhc3NldElkOiB1aW50NjQpOiBib29sZWFuCnRyYW5zZmVyU21hcnRBc3NldFRvOgoJcHJvdG8gMyAxCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6NDUKCS8vIHJldHVybiBzZW5kTWV0aG9kQ2FsbDxbQWRkcmVzcywgdWludDI1Nl0sIGJvb2xlYW4+KHsKCS8vICAgICAgICAgICAgIHNlbmRlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgICAgIG5hbWU6ICdhcmMyMDBfdHJhbnNmZXInLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NChhc3NldElkKSwKCS8vICAgICAgICAgICAgIG1ldGhvZEFyZ3M6IFt0bywgYW1vdW50XSwKCS8vICAgICAgICAgICAgIGZlZTogZ2xvYmFscy5taW5UeG5GZWUsCgkvLyAgICAgICAgIH0pOwoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYXJjMjAwX3RyYW5zZmVyKGFkZHJlc3MsdWludDI1Nilib29sIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo0NgoJLy8gc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJaXR4bl9maWVsZCBTZW5kZXIKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo0OAoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NChhc3NldElkKQoJZnJhbWVfZGlnIC0zIC8vIGFzc2V0SWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6NDkKCS8vIG1ldGhvZEFyZ3M6IFt0bywgYW1vdW50XQoJZnJhbWVfZGlnIC0xIC8vIHRvOiBBZGRyZXNzCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0yIC8vIGFtb3VudDogdWludDI1NgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo1MAoJLy8gZmVlOiBnbG9iYWxzLm1pblR4bkZlZQoJZ2xvYmFsIE1pblR4bkZlZQoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWludCAwCglnZXRiaXQKCXJldHN1YgoKLy8gZ2V0QmFsYW5jZSh0eXBlOiB1aW50OCwgYXNzZXRJZDogdWludDY0KTogdWludDI1NgpnZXRCYWxhbmNlOgoJcHJvdG8gMiAxCgoJLy8gKmlmMTBfY29uZGl0aW9uCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo1NQoJLy8gQUxHTyA9PT0gdHlwZQoJaW50IDAKCWZyYW1lX2RpZyAtMSAvLyB0eXBlOiB1aW50OAoJPT0KCWJ6ICppZjEwX2VuZAoKCS8vICppZjEwX2NvbnNlcXVlbnQKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjU1CgkvLyByZXR1cm4gPHVpbnQyNTY+KHRoaXMuYXBwLmFkZHJlc3MuYmFsYW5jZSAtIHRoaXMuYXBwLmFkZHJlc3MubWluQmFsYW5jZSk7CglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCglwb3AKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCglhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKCXBvcAoJLQoJaXRvYgoJcmV0c3ViCgoqaWYxMF9lbmQ6CgkvLyAqaWYxMV9jb25kaXRpb24KCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjU2CgkvLyBBU0EgPT09IHR5cGUKCWludCAxCglmcmFtZV9kaWcgLTEgLy8gdHlwZTogdWludDgKCT09CglieiAqaWYxMV9lbmQKCgkvLyAqaWYxMV9jb25zZXF1ZW50CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo1NgoJLy8gcmV0dXJuIDx1aW50MjU2PnRoaXMuYXBwLmFkZHJlc3MuYXNzZXRCYWxhbmNlKGFzc2V0SWQpOwoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyBhc3NldElkOiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglpdG9iCglyZXRzdWIKCippZjExX2VuZDoKCS8vICppZjEyX2NvbmRpdGlvbgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6NTcKCS8vIFNNQVJUID09PSB0eXBlCglpbnQgMgoJZnJhbWVfZGlnIC0xIC8vIHR5cGU6IHVpbnQ4Cgk9PQoJYnogKmlmMTJfZW5kCgoJLy8gKmlmMTJfY29uc2VxdWVudAoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6NTgKCS8vIHJldHVybiBzZW5kTWV0aG9kQ2FsbDxbQWRkcmVzc10sIHVpbnQyNTY+KHsKCS8vICAgICAgICAgICAgICAgICBzZW5kZXI6IHRoaXMuYXBwLmFkZHJlc3MsCgkvLyAgICAgICAgICAgICAgICAgbmFtZTogJ2FyYzIwMF9iYWxhbmNlT2YnLAoJLy8gICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQoYXNzZXRJZCksCgkvLyAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3RoaXMuYXBwLmFkZHJlc3NdLAoJLy8gICAgICAgICAgICAgICAgIGZlZTogZ2xvYmFscy5taW5UeG5GZWUsCgkvLyAgICAgICAgICAgICB9KTsKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImFyYzIwMF9iYWxhbmNlT2YoYWRkcmVzcyl1aW50MjU2IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo1OQoJLy8gc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJaXR4bl9maWVsZCBTZW5kZXIKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo2MQoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NChhc3NldElkKQoJZnJhbWVfZGlnIC0yIC8vIGFzc2V0SWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6NjIKCS8vIG1ldGhvZEFyZ3M6IFt0aGlzLmFwcC5hZGRyZXNzXQoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6NjMKCS8vIGZlZTogZ2xvYmFscy5taW5UeG5GZWUKCWdsb2JhbCBNaW5UeG5GZWUKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglyZXRzdWIKCippZjEyX2VuZDoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjY2CgkvLyByZXR1cm4gPHVpbnQyNTY+MDsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCglyZXRzdWIKCi8vIGdldERlY2ltYWxzKHR5cGU6IHVpbnQ4LCBhc3NldElkOiB1aW50NjQpOiB1aW50OApnZXREZWNpbWFsczoKCXByb3RvIDIgMQoKCS8vICppZjEzX2NvbmRpdGlvbgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6NzAKCS8vIEFMR08gPT09IHR5cGUKCWludCAwCglmcmFtZV9kaWcgLTEgLy8gdHlwZTogdWludDgKCT09CglieiAqaWYxM19lbmQKCgkvLyAqaWYxM19jb25zZXF1ZW50CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo3MAoJLy8gcmV0dXJuIDx1aW50OD42OwoJaW50IDYKCXJldHN1YgoKKmlmMTNfZW5kOgoJLy8gKmlmMTRfY29uZGl0aW9uCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo3MQoJLy8gQVNBID09PSB0eXBlCglpbnQgMQoJZnJhbWVfZGlnIC0xIC8vIHR5cGU6IHVpbnQ4Cgk9PQoJYnogKmlmMTRfZW5kCgoJLy8gKmlmMTRfY29uc2VxdWVudAoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6NzEKCS8vIHJldHVybiA8dWludDg+QXNzZXRJRC5mcm9tVWludDY0KGFzc2V0SWQpLmRlY2ltYWxzOwoJZnJhbWVfZGlnIC0yIC8vIGFzc2V0SWQ6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCglwb3AKCXJldHN1YgoKKmlmMTRfZW5kOgoJLy8gKmlmMTVfY29uZGl0aW9uCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo3MgoJLy8gU01BUlQgPT09IHR5cGUKCWludCAyCglmcmFtZV9kaWcgLTEgLy8gdHlwZTogdWludDgKCT09CglieiAqaWYxNV9lbmQKCgkvLyAqaWYxNV9jb25zZXF1ZW50CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo3MwoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtdLCB1aW50OD4oewoJLy8gICAgICAgICAgICAgICAgIHNlbmRlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgICAgICAgICBuYW1lOiAnYXJjMjAwX2RlY2ltYWxzJywKCS8vICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KGFzc2V0SWQpLAoJLy8gICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3M6IFtdLAoJLy8gICAgICAgICAgICAgICAgIGZlZTogZ2xvYmFscy5taW5UeG5GZWUsCgkvLyAgICAgICAgICAgICB9KTsKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImFyYzIwMF9kZWNpbWFscygpdWludDgiCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjc0CgkvLyBzZW5kZXI6IHRoaXMuYXBwLmFkZHJlc3MKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCglpdHhuX2ZpZWxkIFNlbmRlcgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjc2CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KGFzc2V0SWQpCglmcmFtZV9kaWcgLTIgLy8gYXNzZXRJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo3NwoJLy8gbWV0aG9kQXJnczogW10KCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjc4CgkvLyBmZWU6IGdsb2JhbHMubWluVHhuRmVlCglnbG9iYWwgTWluVHhuRmVlCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCWl0eG4gTnVtTG9ncwoJaW50IDEKCS0KCWl0eG5hcyBMb2dzCglleHRyYWN0IDQgMAoJYnRvaQoJcmV0c3ViCgoqaWYxNV9lbmQ6CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo4MAoJLy8gcmV0dXJuIDx1aW50OD4wOwoJaW50IDAKCXJldHN1YgoKLy8gYWxwaGFCYWxhbmNlKCk6IHVpbnQyNTYKYWxwaGFCYWxhbmNlOgoJcHJvdG8gMCAxCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6ODQKCS8vIHJldHVybiB0aGlzLmdldEJhbGFuY2UodGhpcy5hbHBoYVR5cGUudmFsdWUsIHRoaXMuYWxwaGFJZC52YWx1ZSk7CglieXRlIDB4NjE2YzcwNjg2MTVmNjk2NCAvLyAiYWxwaGFfaWQiCglhcHBfZ2xvYmFsX2dldAoJYnl0ZSAweDYxNmM3MDY4NjE1Zjc0Nzk3MDY1IC8vICJhbHBoYV90eXBlIgoJYXBwX2dsb2JhbF9nZXQKCWJ0b2kKCWNhbGxzdWIgZ2V0QmFsYW5jZQoJcmV0c3ViCgovLyBiZXRhQmFsYW5jZSgpOiB1aW50MjU2CmJldGFCYWxhbmNlOgoJcHJvdG8gMCAxCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6ODgKCS8vIHJldHVybiB0aGlzLmdldEJhbGFuY2UodGhpcy5iZXRhVHlwZS52YWx1ZSwgdGhpcy5iZXRhSWQudmFsdWUpOwoJYnl0ZSAweDYyNjU3NDYxNWY2OTY0IC8vICJiZXRhX2lkIgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHg2MjY1NzQ2MTVmNzQ3OTcwNjUgLy8gImJldGFfdHlwZSIKCWFwcF9nbG9iYWxfZ2V0CglidG9pCgljYWxsc3ViIGdldEJhbGFuY2UKCXJldHN1YgoKLy8gYWxwaGFEZWNpbWFscygpOiB1aW50OAphbHBoYURlY2ltYWxzOgoJcHJvdG8gMCAxCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6OTIKCS8vIHJldHVybiB0aGlzLmdldERlY2ltYWxzKHRoaXMuYWxwaGFUeXBlLnZhbHVlLCB0aGlzLmFscGhhSWQudmFsdWUpOwoJYnl0ZSAweDYxNmM3MDY4NjE1ZjY5NjQgLy8gImFscGhhX2lkIgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHg2MTZjNzA2ODYxNWY3NDc5NzA2NSAvLyAiYWxwaGFfdHlwZSIKCWFwcF9nbG9iYWxfZ2V0CglidG9pCgljYWxsc3ViIGdldERlY2ltYWxzCglyZXRzdWIKCi8vIGJldGFEZWNpbWFscygpOiB1aW50OApiZXRhRGVjaW1hbHM6Cglwcm90byAwIDEKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czo5NgoJLy8gcmV0dXJuIHRoaXMuZ2V0RGVjaW1hbHModGhpcy5iZXRhVHlwZS52YWx1ZSwgdGhpcy5iZXRhSWQudmFsdWUpOwoJYnl0ZSAweDYyNjU3NDYxNWY2OTY0IC8vICJiZXRhX2lkIgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHg2MjY1NzQ2MTVmNzQ3OTcwNjUgLy8gImJldGFfdHlwZSIKCWFwcF9nbG9iYWxfZ2V0CglidG9pCgljYWxsc3ViIGdldERlY2ltYWxzCglyZXRzdWIKCi8vIGFscGhhVHJhbnNmZXIodG86IEFkZHJlc3MsIGFtb3VudDogdWludDI1Nik6IGJvb2xlYW4KYWxwaGFUcmFuc2ZlcjoKCXByb3RvIDIgMQoKCS8vICppZjE2X2NvbmRpdGlvbgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MTAwCgkvLyB0aGlzLmFscGhhVHlwZS52YWx1ZSA9PT0gQUxHTwoJYnl0ZSAweDYxNmM3MDY4NjE1Zjc0Nzk3MDY1IC8vICJhbHBoYV90eXBlIgoJYXBwX2dsb2JhbF9nZXQKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMTZfZW5kCgoJLy8gKmlmMTZfY29uc2VxdWVudAoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MTAxCgkvLyByZXR1cm4gdGhpcy50cmFuc2ZlckFsZ29Ubyh0bywgYW1vdW50KTsKCWZyYW1lX2RpZyAtMiAvLyBhbW91bnQ6IHVpbnQyNTYKCWZyYW1lX2RpZyAtMSAvLyB0bzogQWRkcmVzcwoJY2FsbHN1YiB0cmFuc2ZlckFsZ29UbwoJcmV0c3ViCgoqaWYxNl9lbmQ6CgkvLyAqaWYxN19jb25kaXRpb24KCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjEwMwoJLy8gdGhpcy5hbHBoYVR5cGUudmFsdWUgPT09IEFTQQoJYnl0ZSAweDYxNmM3MDY4NjE1Zjc0Nzk3MDY1IC8vICJhbHBoYV90eXBlIgoJYXBwX2dsb2JhbF9nZXQKCWJ0b2kKCWludCAxCgk9PQoJYnogKmlmMTdfZW5kCgoJLy8gKmlmMTdfY29uc2VxdWVudAoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MTA0CgkvLyByZXR1cm4gdGhpcy50cmFuc2ZlckFzYVRvKHRvLCBhbW91bnQsIHRoaXMuYWxwaGFJZC52YWx1ZSk7CglieXRlIDB4NjE2YzcwNjg2MTVmNjk2NCAvLyAiYWxwaGFfaWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFtb3VudDogdWludDI1NgoJZnJhbWVfZGlnIC0xIC8vIHRvOiBBZGRyZXNzCgljYWxsc3ViIHRyYW5zZmVyQXNhVG8KCXJldHN1YgoKKmlmMTdfZW5kOgoJLy8gKmlmMThfY29uZGl0aW9uCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czoxMDYKCS8vIHRoaXMuYWxwaGFUeXBlLnZhbHVlID09PSBTTUFSVAoJYnl0ZSAweDYxNmM3MDY4NjE1Zjc0Nzk3MDY1IC8vICJhbHBoYV90eXBlIgoJYXBwX2dsb2JhbF9nZXQKCWJ0b2kKCWludCAyCgk9PQoJYnogKmlmMThfZW5kCgoJLy8gKmlmMThfY29uc2VxdWVudAoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MTA3CgkvLyByZXR1cm4gdGhpcy50cmFuc2ZlclNtYXJ0QXNzZXRUbyh0bywgYW1vdW50LCB0aGlzLmFscGhhSWQudmFsdWUpOwoJYnl0ZSAweDYxNmM3MDY4NjE1ZjY5NjQgLy8gImFscGhhX2lkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMiAvLyBhbW91bnQ6IHVpbnQyNTYKCWZyYW1lX2RpZyAtMSAvLyB0bzogQWRkcmVzcwoJY2FsbHN1YiB0cmFuc2ZlclNtYXJ0QXNzZXRUbwoJcmV0c3ViCgoqaWYxOF9lbmQ6CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czoxMDkKCS8vIHJldHVybiBmYWxzZTsKCWludCAwCglyZXRzdWIKCi8vIGJldGFUcmFuc2Zlcih0bzogQWRkcmVzcywgYW1vdW50OiB1aW50MjU2KTogYm9vbGVhbgpiZXRhVHJhbnNmZXI6Cglwcm90byAyIDEKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjExMwoJLy8gdGhpcy5iZXRhVHlwZS52YWx1ZSA9PT0gQUxHTwoJYnl0ZSAweDYyNjU3NDYxNWY3NDc5NzA2NSAvLyAiYmV0YV90eXBlIgoJYXBwX2dsb2JhbF9nZXQKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMTlfZW5kCgoJLy8gKmlmMTlfY29uc2VxdWVudAoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MTE0CgkvLyByZXR1cm4gdGhpcy50cmFuc2ZlckFsZ29Ubyh0bywgYW1vdW50KTsKCWZyYW1lX2RpZyAtMiAvLyBhbW91bnQ6IHVpbnQyNTYKCWZyYW1lX2RpZyAtMSAvLyB0bzogQWRkcmVzcwoJY2FsbHN1YiB0cmFuc2ZlckFsZ29UbwoJcmV0c3ViCgoqaWYxOV9lbmQ6CgkvLyAqaWYyMF9jb25kaXRpb24KCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjExNgoJLy8gdGhpcy5iZXRhVHlwZS52YWx1ZSA9PT0gQVNBCglieXRlIDB4NjI2NTc0NjE1Zjc0Nzk3MDY1IC8vICJiZXRhX3R5cGUiCglhcHBfZ2xvYmFsX2dldAoJYnRvaQoJaW50IDEKCT09CglieiAqaWYyMF9lbmQKCgkvLyAqaWYyMF9jb25zZXF1ZW50CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czoxMTcKCS8vIHJldHVybiB0aGlzLnRyYW5zZmVyQXNhVG8odG8sIGFtb3VudCwgdGhpcy5iZXRhSWQudmFsdWUpOwoJYnl0ZSAweDYyNjU3NDYxNWY2OTY0IC8vICJiZXRhX2lkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMiAvLyBhbW91bnQ6IHVpbnQyNTYKCWZyYW1lX2RpZyAtMSAvLyB0bzogQWRkcmVzcwoJY2FsbHN1YiB0cmFuc2ZlckFzYVRvCglyZXRzdWIKCippZjIwX2VuZDoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MTE5CgkvLyB0aGlzLmJldGFUeXBlLnZhbHVlID09PSBTTUFSVAoJYnl0ZSAweDYyNjU3NDYxNWY3NDc5NzA2NSAvLyAiYmV0YV90eXBlIgoJYXBwX2dsb2JhbF9nZXQKCWJ0b2kKCWludCAyCgk9PQoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MTIwCgkvLyByZXR1cm4gdGhpcy50cmFuc2ZlclNtYXJ0QXNzZXRUbyh0bywgYW1vdW50LCB0aGlzLmJldGFJZC52YWx1ZSk7CglieXRlIDB4NjI2NTc0NjE1ZjY5NjQgLy8gImJldGFfaWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFtb3VudDogdWludDI1NgoJZnJhbWVfZGlnIC0xIC8vIHRvOiBBZGRyZXNzCgljYWxsc3ViIHRyYW5zZmVyU21hcnRBc3NldFRvCglyZXRzdWIKCippZjIxX2VuZDoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjEyMgoJLy8gcmV0dXJuIGZhbHNlOwoJaW50IDAKCXJldHN1YgoKLy8gZXh0ZW5kQnVkZ2V0KCk6IHZvaWQKZXh0ZW5kQnVkZ2V0OgoJcHJvdG8gMCAwCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MTI2CgkvLyBzZW5kTWV0aG9kQ2FsbDxbdWludDY0XSwgdm9pZD4oewoJLy8gICAgICAgICAgICAgbmFtZTogJ25vb3AnLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogWzBdLAoJLy8gICAgICAgICAgICAgc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogdGhpcy5mYWN0b3J5LnZhbHVlLAoJLy8gICAgICAgICAgICAgZmVlOiBnbG9iYWxzLm1pblR4bkZlZQoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAibm9vcCh1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzEvUG9vbDEyLmFsZ28udHM6MTI4CgkvLyBtZXRob2RBcmdzOiBbMF0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjEyOQoJLy8gc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJaXR4bl9maWVsZCBTZW5kZXIKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMS9Qb29sMTIuYWxnby50czoxMzAKCS8vIGFwcGxpY2F0aW9uSUQ6IHRoaXMuZmFjdG9yeS52YWx1ZQoJYnl0ZSAweDY2NjE2Mzc0NmY3Mjc5IC8vICJmYWN0b3J5IgoJYXBwX2dsb2JhbF9nZXQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8xL1Bvb2wxMi5hbGdvLnRzOjEzMQoJLy8gZmVlOiBnbG9iYWxzLm1pblR4bkZlZQoJZ2xvYmFsIE1pblR4bkZlZQoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglyZXRzdWIKCi8vIHBvd09mVGVuKHBvdzogdWludDY0KTogdWludDI1Ngpwb3dPZlRlbjoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXAKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czo2CgkvLyByZXN1bHQ6IHVpbnQyNTYgPSAxCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQoJZnJhbWVfYnVyeSAwIC8vIHJlc3VsdDogdW5zYWZlIHVpbnQyNTYKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czo4CgkvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcG93OyBpID0gaSArIDEpCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGk6IHVpbnQ2NAoKKmZvcl8wOgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6OAoJLy8gaSA8IHBvdwoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglmcmFtZV9kaWcgLTEgLy8gcG93OiB1aW50NjQKCTwKCWJ6ICpmb3JfMF9lbmQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czo5CgkvLyByZXN1bHQgPSByZXN1bHQgKiA8dWludDI1Nj4xMAoJZnJhbWVfZGlnIDAgLy8gcmVzdWx0OiB1bnNhZmUgdWludDI1NgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGEKCWIqCglmcmFtZV9idXJ5IDAgLy8gcmVzdWx0OiB1bnNhZmUgdWludDI1NgoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6OAoJLy8gaSA9IGkgKyAxCglmcmFtZV9kaWcgMSAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDEgLy8gaTogdWludDY0CgliICpmb3JfMAoKKmZvcl8wX2VuZDoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjEyCgkvLyByZXR1cm4gcmVzdWx0OwoJZnJhbWVfZGlnIDAgLy8gcmVzdWx0OiB1bnNhZmUgdWludDI1NgoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gaGFuZGxlQWRkTGlxdWlkaXR5KGFscGhhQW1vdW50OiB1aW50MjU2LCBiZXRhQW1vdW50OiB1aW50MjU2KTogYm9vbGVhbgpoYW5kbGVBZGRMaXF1aWRpdHk6Cglwcm90byAyIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAxMAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjE2CgkvLyBhc3NlcnQoYWxwaGFBbW91bnQgPiAwICYmIGJldGFBbW91bnQgPiAwLCAnYW1vdW50IG11c3QgYmUgPiB6ZXJvJykKCWZyYW1lX2RpZyAtMSAvLyBhbHBoYUFtb3VudDogdWludDI1NgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCWI+CglkdXAKCWJ6ICpza2lwX2FuZDIKCWZyYW1lX2RpZyAtMiAvLyBiZXRhQW1vdW50OiB1aW50MjU2CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYj4KCSYmCgoqc2tpcF9hbmQyOgoJLy8gYW1vdW50IG11c3QgYmUgPiB6ZXJvCglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czoxOAoJLy8gYWxwaGFCYWxhbmNlID0gdGhpcy5hbHBoYUJhbGFuY2UoKQoJY2FsbHN1YiBhbHBoYUJhbGFuY2UKCWZyYW1lX2J1cnkgMCAvLyBhbHBoYUJhbGFuY2U6IHVuc2FmZSB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6MTkKCS8vIGJldGFCYWxhbmNlID0gdGhpcy5iZXRhQmFsYW5jZSgpCgljYWxsc3ViIGJldGFCYWxhbmNlCglmcmFtZV9idXJ5IDEgLy8gYmV0YUJhbGFuY2U6IHVuc2FmZSB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6MjAKCS8vIGlzc3VlZExwdEJlZm9yZSA9IDx1aW50MjU2Pih0aGlzLnRvdGFsU3VwcGx5LnZhbHVlIC0gdGhpcy5hcmMyMDBfYmFsYW5jZU9mKHRoaXMuYXBwLmFkZHJlc3MpKQoJYnl0ZSAweDc0NmY3NDYxNmM1ZjczNzU3MDcwNmM3OSAvLyAidG90YWxfc3VwcGx5IgoJYXBwX2dsb2JhbF9nZXQKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCgljYWxsc3ViIGFyYzIwMF9iYWxhbmNlT2YKCWItCglmcmFtZV9idXJ5IDIgLy8gaXNzdWVkTHB0QmVmb3JlOiB1bnNhZmUgdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjIxCgkvLyBscHRUb01pbnQgPSA8dWludDI1Nj4wCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJZnJhbWVfYnVyeSAzIC8vIGxwdFRvTWludDogdW5zYWZlIHVpbnQyNTYKCgkvLyAqaWYyMl9jb25kaXRpb24KCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjIzCgkvLyBpc3N1ZWRMcHRCZWZvcmUgPT09IDx1aW50MjU2PjAKCWZyYW1lX2RpZyAyIC8vIGlzc3VlZExwdEJlZm9yZTogdW5zYWZlIHVpbnQyNTYKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCgliPT0KCWJ6ICppZjIyX2Vsc2UKCgkvLyAqaWYyMl9jb25zZXF1ZW50CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czoyNAoJLy8gYWxwaGFEZWNpbWFscyA9IHRoaXMuYWxwaGFEZWNpbWFscygpCgljYWxsc3ViIGFscGhhRGVjaW1hbHMKCWZyYW1lX2J1cnkgNCAvLyBhbHBoYURlY2ltYWxzOiB1bnNhZmUgdWludDgKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czoyNQoJLy8gYmV0YURlY2ltYWxzID0gdGhpcy5iZXRhRGVjaW1hbHMoKQoJY2FsbHN1YiBiZXRhRGVjaW1hbHMKCWZyYW1lX2J1cnkgNSAvLyBiZXRhRGVjaW1hbHM6IHVuc2FmZSB1aW50OAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjI3CgkvLyBhbHBoYU5vcm1hbGl6ZWQgPSA8dWludDI1Nj4oKGFscGhhQW1vdW50ICogdGhpcy5wb3dPZlRlbihERUNJTUFMUykpIC8gdGhpcy5wb3dPZlRlbig8dWludDY0PmFscGhhRGVjaW1hbHMpKQoJZnJhbWVfZGlnIC0xIC8vIGFscGhhQW1vdW50OiB1aW50MjU2CglpbnQgNgoJY2FsbHN1YiBwb3dPZlRlbgoJYioKCWZyYW1lX2RpZyA0IC8vIGFscGhhRGVjaW1hbHM6IHVuc2FmZSB1aW50OAoJY2FsbHN1YiBwb3dPZlRlbgoJYi8KCWZyYW1lX2J1cnkgNiAvLyBhbHBoYU5vcm1hbGl6ZWQ6IHVuc2FmZSB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6MjgKCS8vIGJldGFOb3JtYWxpemVkID0gPHVpbnQyNTY+KChiZXRhQW1vdW50ICogdGhpcy5wb3dPZlRlbihERUNJTUFMUykpIC8gdGhpcy5wb3dPZlRlbig8dWludDY0PmJldGFEZWNpbWFscykpCglmcmFtZV9kaWcgLTIgLy8gYmV0YUFtb3VudDogdWludDI1NgoJaW50IDYKCWNhbGxzdWIgcG93T2ZUZW4KCWIqCglmcmFtZV9kaWcgNSAvLyBiZXRhRGVjaW1hbHM6IHVuc2FmZSB1aW50OAoJY2FsbHN1YiBwb3dPZlRlbgoJYi8KCWZyYW1lX2J1cnkgNyAvLyBiZXRhTm9ybWFsaXplZDogdW5zYWZlIHVpbnQyNTYKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czozMAoJLy8gbHB0VG9NaW50ID0gPHVpbnQyNTY+c3FydChhbHBoYU5vcm1hbGl6ZWQgKiBiZXRhTm9ybWFsaXplZCkKCWZyYW1lX2RpZyA2IC8vIGFscGhhTm9ybWFsaXplZDogdW5zYWZlIHVpbnQyNTYKCWZyYW1lX2RpZyA3IC8vIGJldGFOb3JtYWxpemVkOiB1bnNhZmUgdWludDI1NgoJYioKCWJzcXJ0CglmcmFtZV9idXJ5IDMgLy8gbHB0VG9NaW50OiB1bnNhZmUgdWludDI1NgoJYiAqaWYyMl9lbmQKCippZjIyX2Vsc2U6CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czozMgoJLy8gcmF0aW9BbHBoYSA9IDx1aW50MjU2PigoYWxwaGFBbW91bnQgKiA8dWludDI1Nj5TQ0FMRSkgLyAoYWxwaGFCYWxhbmNlIC0gYWxwaGFBbW91bnQpKQoJZnJhbWVfZGlnIC0xIC8vIGFscGhhQW1vdW50OiB1aW50MjU2CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVhZjMxMDdhNDAwMAoJYioKCWZyYW1lX2RpZyAwIC8vIGFscGhhQmFsYW5jZTogdW5zYWZlIHVpbnQyNTYKCWZyYW1lX2RpZyAtMSAvLyBhbHBoYUFtb3VudDogdWludDI1NgoJYi0KCWIvCglmcmFtZV9idXJ5IDggLy8gcmF0aW9BbHBoYTogdW5zYWZlIHVpbnQyNTYKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czozMwoJLy8gcmF0aW9CZXRhID0gPHVpbnQyNTY+KChiZXRhQW1vdW50ICogPHVpbnQyNTY+U0NBTEUpIC8gKGJldGFCYWxhbmNlIC0gYmV0YUFtb3VudCkpCglmcmFtZV9kaWcgLTIgLy8gYmV0YUFtb3VudDogdWludDI1NgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1YWYzMTA3YTQwMDAKCWIqCglmcmFtZV9kaWcgMSAvLyBiZXRhQmFsYW5jZTogdW5zYWZlIHVpbnQyNTYKCWZyYW1lX2RpZyAtMiAvLyBiZXRhQW1vdW50OiB1aW50MjU2CgliLQoJYi8KCWZyYW1lX2J1cnkgOSAvLyByYXRpb0JldGE6IHVuc2FmZSB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6MzQKCS8vIHJhdGlvID0gcmF0aW9BbHBoYSA8IHJhdGlvQmV0YSA/IHJhdGlvQWxwaGEgOiByYXRpb0JldGEKCWZyYW1lX2RpZyA4IC8vIHJhdGlvQWxwaGE6IHVuc2FmZSB1aW50MjU2CglmcmFtZV9kaWcgOSAvLyByYXRpb0JldGE6IHVuc2FmZSB1aW50MjU2CgliPAoJYnogKnRlcm5hcnkwX2ZhbHNlCglmcmFtZV9kaWcgOCAvLyByYXRpb0FscGhhOiB1bnNhZmUgdWludDI1NgoJYiAqdGVybmFyeTBfZW5kCgoqdGVybmFyeTBfZmFsc2U6CglmcmFtZV9kaWcgOSAvLyByYXRpb0JldGE6IHVuc2FmZSB1aW50MjU2CgoqdGVybmFyeTBfZW5kOgoJZnJhbWVfYnVyeSAxMCAvLyByYXRpbzogdW5zYWZlIHVpbnQyNTYKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czozNgoJLy8gbHB0VG9NaW50ID0gKGlzc3VlZExwdEJlZm9yZSAqIHJhdGlvKSAvIDx1aW50MjU2PlNDQUxFCglmcmFtZV9kaWcgMiAvLyBpc3N1ZWRMcHRCZWZvcmU6IHVuc2FmZSB1aW50MjU2CglmcmFtZV9kaWcgMTAgLy8gcmF0aW86IHVuc2FmZSB1aW50MjU2CgliKgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1YWYzMTA3YTQwMDAKCWIvCglmcmFtZV9idXJ5IDMgLy8gbHB0VG9NaW50OiB1bnNhZmUgdWludDI1NgoKKmlmMjJfZW5kOgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6MzkKCS8vIGFzc2VydChscHRUb01pbnQgPiA8dWludDI1Nj4wKQoJZnJhbWVfZGlnIDMgLy8gbHB0VG9NaW50OiB1bnNhZmUgdWludDI1NgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCWI+Cglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czo0MAoJLy8gYXNzZXJ0KHRoaXMudHJhbnNmZXIodGhpcy5hcHAuYWRkcmVzcywgdGhpcy50eG4uc2VuZGVyLCBscHRUb01pbnQpKQoJZnJhbWVfZGlnIDMgLy8gbHB0VG9NaW50OiB1bnNhZmUgdWludDI1NgoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9CgoJLy8gbHB0VG9NaW50IG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCXR4biBTZW5kZXIKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCgljYWxsc3ViIHRyYW5zZmVyCglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czo0MgoJLy8gdGhpcy5EZXBvc2l0LmxvZyh7CgkvLyAgICAgICBzZW5kZXI6IHRoaXMudHhuLnNlbmRlciwKCS8vICAgICAgIGluQW10czogW2FscGhhQW1vdW50LCBiZXRhQW1vdW50XSwKCS8vICAgICAgIG91dExwdDogbHB0VG9NaW50LAoJLy8gICAgICAgcG9vbEJhbHM6IFthbHBoYUJhbGFuY2UsIGJldGFCYWxhbmNlXSwKCS8vICAgICB9KQoJYnl0ZSAweDNkMDEzZTdkIC8vIERlcG9zaXQoYWRkcmVzcywodWludDI1Nix1aW50MjU2KSx1aW50MjU2LCh1aW50MjU2LHVpbnQyNTYpKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGFscGhhQW1vdW50OiB1aW50MjU2CglmcmFtZV9kaWcgLTIgLy8gYmV0YUFtb3VudDogdWludDI1NgoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2RpZyAzIC8vIGxwdFRvTWludDogdW5zYWZlIHVpbnQyNTYKCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIGxwdFRvTWludCBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCgljb25jYXQKCWZyYW1lX2RpZyAwIC8vIGFscGhhQmFsYW5jZTogdW5zYWZlIHVpbnQyNTYKCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIGFscGhhQmFsYW5jZSBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCglmcmFtZV9kaWcgMSAvLyBiZXRhQmFsYW5jZTogdW5zYWZlIHVpbnQyNTYKCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIGJldGFCYWxhbmNlIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjQ5CgkvLyByZXR1cm4gdHJ1ZTsKCWludCAxCgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMTAKCXJldHN1YgoKLy8gcmVtb3ZlTGlxdWlkaXR5KHVpbnQyNTYpYm9vbAoqYWJpX3JvdXRlX3JlbW92ZUxpcXVpZGl0eToKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gbHB0QW1vdW50OiB1aW50MjU2Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGxwdEFtb3VudCkgZm9yIHJlbW92ZUxpcXVpZGl0eSBtdXN0IGJlIGEgdWludDI1NgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSByZW1vdmVMaXF1aWRpdHkodWludDI1Nilib29sCgljYWxsc3ViIHJlbW92ZUxpcXVpZGl0eQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyByZW1vdmVMaXF1aWRpdHkobHB0QW1vdW50OiB1aW50MjU2KTogYm9vbGVhbgpyZW1vdmVMaXF1aWRpdHk6Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA3CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6NTMKCS8vIGFscGhhQmFsYW5jZTogdWludDI1NiA9IHRoaXMuYWxwaGFCYWxhbmNlKCkKCWNhbGxzdWIgYWxwaGFCYWxhbmNlCglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyB0aGlzLmFscGhhQmFsYW5jZSgpIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWZyYW1lX2J1cnkgMCAvLyBhbHBoYUJhbGFuY2U6IHVuc2FmZSB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6NTQKCS8vIGJldGFCYWxhbmNlOiB1aW50MjU2ID0gdGhpcy5iZXRhQmFsYW5jZSgpCgljYWxsc3ViIGJldGFCYWxhbmNlCglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyB0aGlzLmJldGFCYWxhbmNlKCkgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJZnJhbWVfYnVyeSAxIC8vIGJldGFCYWxhbmNlOiB1bnNhZmUgdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjU2CgkvLyBhc3NlcnQoYWxwaGFCYWxhbmNlID4gPHVpbnQyNTY+MCAmJiBiZXRhQmFsYW5jZSA+IDx1aW50MjU2PjAsICdiYWxhbmNlIG11c3QgYmUgPiB6ZXJvJykKCWZyYW1lX2RpZyAwIC8vIGFscGhhQmFsYW5jZTogdW5zYWZlIHVpbnQyNTYKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCgliPgoJZHVwCglieiAqc2tpcF9hbmQzCglmcmFtZV9kaWcgMSAvLyBiZXRhQmFsYW5jZTogdW5zYWZlIHVpbnQyNTYKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCgliPgoJJiYKCipza2lwX2FuZDM6CgkvLyBiYWxhbmNlIG11c3QgYmUgPiB6ZXJvCglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czo1OAoJLy8gdHhuRmVlcyA9IDx1aW50MjU2Pig0ICogZ2xvYmFscy5taW5UeG5GZWUpCglpbnQgNAoJZ2xvYmFsIE1pblR4bkZlZQoJKgoJaXRvYgoJZnJhbWVfYnVyeSAyIC8vIHR4bkZlZXM6IHVuc2FmZSB1aW50MjU2CgoJLy8gKmlmMjNfY29uZGl0aW9uCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czo1OQoJLy8gdGhpcy5hbHBoYVR5cGUudmFsdWUgPT09IEFMR08KCWJ5dGUgMHg2MTZjNzA2ODYxNWY3NDc5NzA2NSAvLyAiYWxwaGFfdHlwZSIKCWFwcF9nbG9iYWxfZ2V0CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjIzX2Vsc2VpZjFfY29uZGl0aW9uCgoJLy8gKmlmMjNfY29uc2VxdWVudAoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6NjAKCS8vIGFscGhhQmFsYW5jZSA9IGFscGhhQmFsYW5jZSAtIHR4bkZlZXMKCWZyYW1lX2RpZyAwIC8vIGFscGhhQmFsYW5jZTogdW5zYWZlIHVpbnQyNTYKCWZyYW1lX2RpZyAyIC8vIHR4bkZlZXM6IHVuc2FmZSB1aW50MjU2CgliLQoJZnJhbWVfYnVyeSAwIC8vIGFscGhhQmFsYW5jZTogdW5zYWZlIHVpbnQyNTYKCWIgKmlmMjNfZW5kCgoqaWYyM19lbHNlaWYxX2NvbmRpdGlvbjoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjYxCgkvLyB0aGlzLmJldGFUeXBlLnZhbHVlID09PSBBTEdPCglieXRlIDB4NjI2NTc0NjE1Zjc0Nzk3MDY1IC8vICJiZXRhX3R5cGUiCglhcHBfZ2xvYmFsX2dldAoJYnRvaQoJaW50IDAKCT09CglieiAqaWYyM19lbmQKCgkvLyAqaWYyM19lbHNlaWYxX2NvbnNlcXVlbnQKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjYyCgkvLyBiZXRhQmFsYW5jZSA9IGJldGFCYWxhbmNlIC0gdHhuRmVlcwoJZnJhbWVfZGlnIDEgLy8gYmV0YUJhbGFuY2U6IHVuc2FmZSB1aW50MjU2CglmcmFtZV9kaWcgMiAvLyB0eG5GZWVzOiB1bnNhZmUgdWludDI1NgoJYi0KCWZyYW1lX2J1cnkgMSAvLyBiZXRhQmFsYW5jZTogdW5zYWZlIHVpbnQyNTYKCippZjIzX2VuZDoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjY1CgkvLyBpc3N1ZWRMcHRCZWZvcmU6IHVpbnQyNTYgPSB0aGlzLnRvdGFsU3VwcGx5LnZhbHVlIC0gdGhpcy5hcmMyMDBfYmFsYW5jZU9mKHRoaXMuYXBwLmFkZHJlc3MpCglieXRlIDB4NzQ2Zjc0NjE2YzVmNzM3NTcwNzA2Yzc5IC8vICJ0b3RhbF9zdXBwbHkiCglhcHBfZ2xvYmFsX2dldAoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWNhbGxzdWIgYXJjMjAwX2JhbGFuY2VPZgoJYi0KCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgLSB0aGlzLmFyYzIwMF9iYWxhbmNlT2YodGhpcy5hcHAuYWRkcmVzcykgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJZnJhbWVfYnVyeSAzIC8vIGlzc3VlZExwdEJlZm9yZTogdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjY2CgkvLyBhbHBoYUFtb3VudDogdWludDI1NiA9IChhbHBoYUJhbGFuY2UgKiBscHRBbW91bnQpIC8gaXNzdWVkTHB0QmVmb3JlCglmcmFtZV9kaWcgMCAvLyBhbHBoYUJhbGFuY2U6IHVuc2FmZSB1aW50MjU2CglmcmFtZV9kaWcgLTEgLy8gbHB0QW1vdW50OiB1aW50MjU2CgliKgoJZnJhbWVfZGlnIDMgLy8gaXNzdWVkTHB0QmVmb3JlOiB1aW50MjU2CgliLwoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9CgoJLy8gKGFscGhhQmFsYW5jZSAqIGxwdEFtb3VudCkgLyBpc3N1ZWRMcHRCZWZvcmUgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJZnJhbWVfYnVyeSA0IC8vIGFscGhhQW1vdW50OiB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6NjcKCS8vIGJldGFBbW91bnQ6IHVpbnQyNTYgPSAoYmV0YUJhbGFuY2UgKiBscHRBbW91bnQpIC8gaXNzdWVkTHB0QmVmb3JlCglmcmFtZV9kaWcgMSAvLyBiZXRhQmFsYW5jZTogdW5zYWZlIHVpbnQyNTYKCWZyYW1lX2RpZyAtMSAvLyBscHRBbW91bnQ6IHVpbnQyNTYKCWIqCglmcmFtZV9kaWcgMyAvLyBpc3N1ZWRMcHRCZWZvcmU6IHVpbnQyNTYKCWIvCglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyAoYmV0YUJhbGFuY2UgKiBscHRBbW91bnQpIC8gaXNzdWVkTHB0QmVmb3JlIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWZyYW1lX2J1cnkgNSAvLyBiZXRhQW1vdW50OiB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6NjkKCS8vIGFzc2VydChhbHBoYUFtb3VudCA+IDAgJiYgYmV0YUFtb3VudCA+IDAsICdhbW91bnQgbXVzdCBiZSA+IHplcm8nKQoJZnJhbWVfZGlnIDQgLy8gYWxwaGFBbW91bnQ6IHVpbnQyNTYKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCgliPgoJZHVwCglieiAqc2tpcF9hbmQ0CglmcmFtZV9kaWcgNSAvLyBiZXRhQW1vdW50OiB1aW50MjU2CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYj4KCSYmCgoqc2tpcF9hbmQ0OgoJLy8gYW1vdW50IG11c3QgYmUgPiB6ZXJvCglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czo3MQoJLy8gYXNzZXJ0KHRoaXMudHJhbnNmZXIodGhpcy50eG4uc2VuZGVyLCB0aGlzLmFwcC5hZGRyZXNzLCBscHRBbW91bnQpKQoJZnJhbWVfZGlnIC0xIC8vIGxwdEFtb3VudDogdWludDI1NgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCXR4biBTZW5kZXIKCWNhbGxzdWIgdHJhbnNmZXIKCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjcyCgkvLyBhc3NlcnQodGhpcy5hbHBoYVRyYW5zZmVyKHRoaXMudHhuLnNlbmRlciwgYWxwaGFBbW91bnQpKQoJZnJhbWVfZGlnIDQgLy8gYWxwaGFBbW91bnQ6IHVpbnQyNTYKCXR4biBTZW5kZXIKCWNhbGxzdWIgYWxwaGFUcmFuc2ZlcgoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6NzMKCS8vIGFzc2VydCh0aGlzLmJldGFUcmFuc2Zlcih0aGlzLnR4bi5zZW5kZXIsIGJldGFBbW91bnQpKQoJZnJhbWVfZGlnIDUgLy8gYmV0YUFtb3VudDogdWludDI1NgoJdHhuIFNlbmRlcgoJY2FsbHN1YiBiZXRhVHJhbnNmZXIKCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjc1CgkvLyBmaW5hbEJhbGFuY2VYOiB1aW50MjU2ID0gYWxwaGFCYWxhbmNlIC0gYWxwaGFBbW91bnQKCWZyYW1lX2RpZyAwIC8vIGFscGhhQmFsYW5jZTogdW5zYWZlIHVpbnQyNTYKCWZyYW1lX2RpZyA0IC8vIGFscGhhQW1vdW50OiB1aW50MjU2CgliLQoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9CgoJLy8gYWxwaGFCYWxhbmNlIC0gYWxwaGFBbW91bnQgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJZnJhbWVfYnVyeSA2IC8vIGZpbmFsQmFsYW5jZVg6IHVpbnQyNTYKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjEuYWxnby50czo3NgoJLy8gZmluYWxCYWxhbmNlWTogdWludDI1NiA9IGJldGFCYWxhbmNlIC0gYmV0YUFtb3VudAoJZnJhbWVfZGlnIDEgLy8gYmV0YUJhbGFuY2U6IHVuc2FmZSB1aW50MjU2CglmcmFtZV9kaWcgNSAvLyBiZXRhQW1vdW50OiB1aW50MjU2CgliLQoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9CgoJLy8gYmV0YUJhbGFuY2UgLSBiZXRhQW1vdW50IG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWZyYW1lX2J1cnkgNyAvLyBmaW5hbEJhbGFuY2VZOiB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIxLmFsZ28udHM6NzgKCS8vIHRoaXMuV2l0aGRyYXcubG9nKHsKCS8vICAgICAgIHNlbmRlcjogdGhpcy50eG4uc2VuZGVyLAoJLy8gICAgICAgaW5McHQ6IGxwdEFtb3VudCwKCS8vICAgICAgIG91dEFtdHM6IFthbHBoYUFtb3VudCwgYmV0YUFtb3VudF0sCgkvLyAgICAgICBwb29sQmFsczogW2ZpbmFsQmFsYW5jZVgsIGZpbmFsQmFsYW5jZVldLAoJLy8gICAgIH0pCglieXRlIDB4YTY4ZTY1NWMgLy8gV2l0aGRyYXcoYWRkcmVzcyx1aW50MjU2LCh1aW50MjU2LHVpbnQyNTYpLCh1aW50MjU2LHVpbnQyNTYpKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGxwdEFtb3VudDogdWludDI1NgoJY29uY2F0CglmcmFtZV9kaWcgNCAvLyBhbHBoYUFtb3VudDogdWludDI1NgoJZnJhbWVfZGlnIDUgLy8gYmV0YUFtb3VudDogdWludDI1NgoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2RpZyA2IC8vIGZpbmFsQmFsYW5jZVg6IHVpbnQyNTYKCWZyYW1lX2RpZyA3IC8vIGZpbmFsQmFsYW5jZVk6IHVpbnQyNTYKCWNvbmNhdAoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMS5hbGdvLnRzOjg1CgkvLyByZXR1cm4gdHJ1ZTsKCWludCAxCgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gNwoJcmV0c3ViCgovLyB2ZXJpZnlEZXBvc2l0VHhuKHR4bjogVHhuLCBhc3NldFR5cGU6IHVpbnQ4LCBhc3NldElkOiB1aW50NjQpOiB1aW50MjU2CnZlcmlmeURlcG9zaXRUeG46Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vICppZjI0X2NvbmRpdGlvbgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIyLmFsZ28udHM6NwoJLy8gYXNzZXRUeXBlID09PSBBTEdPCglmcmFtZV9kaWcgLTIgLy8gYXNzZXRUeXBlOiB1aW50OAoJaW50IDAKCT09CglieiAqaWYyNF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vICppZjI0X2NvbnNlcXVlbnQKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMi5hbGdvLnRzOjkKCS8vIHZlcmlmeVR4bih0eG4sIHsKCS8vICAgICAgICAgdHlwZUVudW06IFRyYW5zYWN0aW9uVHlwZS5QYXltZW50LAoJLy8gICAgICAgICBzZW5kZXI6IHRoaXMudHhuLnNlbmRlciwKCS8vICAgICAgICAgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsCgkvLyAgICAgICAgIGFtb3VudDogeyBncmVhdGVyVGhhbjogMCB9LAoJLy8gICAgICAgICByZWtleVRvOiBnbG9iYWxzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICBjbG9zZVJlbWFpbmRlclRvOiBnbG9iYWxzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgfSkKCS8vIHZlcmlmeSB0eXBlRW51bQoJZnJhbWVfZGlnIC0xIC8vIHR4bjogVHhuCglndHhucyBUeXBlRW51bQoJaW50IHBheQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InR4biIsImZpZWxkIjoidHlwZUVudW0iLCJleHBlY3RlZCI6IlRyYW5zYWN0aW9uVHlwZS5QYXltZW50In0KCWFzc2VydAoKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyB0eG46IFR4bgoJZ3R4bnMgU2VuZGVyCgl0eG4gU2VuZGVyCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoidHhuIiwiZmllbGQiOiJzZW5kZXIiLCJleHBlY3RlZCI6InRoaXMudHhuLnNlbmRlciJ9Cglhc3NlcnQKCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyB0eG46IFR4bgoJZ3R4bnMgUmVjZWl2ZXIKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoidHhuIiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyB2ZXJpZnkgYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gdHhuOiBUeG4KCWd0eG5zIEFtb3VudAoJaW50IDAKCT4KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InR4biIsImZpZWxkIjoiYW1vdW50IiwiY29uZGl0aW9uIjoiZ3JlYXRlclRoYW4iLCJleHBlY3RlZCI6Ij4wIn0KCWFzc2VydAoKCS8vIHZlcmlmeSByZWtleVRvCglmcmFtZV9kaWcgLTEgLy8gdHhuOiBUeG4KCWd0eG5zIFJla2V5VG8KCWdsb2JhbCBaZXJvQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InR4biIsImZpZWxkIjoicmVrZXlUbyIsImV4cGVjdGVkIjoiZ2xvYmFscy56ZXJvQWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyB2ZXJpZnkgY2xvc2VSZW1haW5kZXJUbwoJZnJhbWVfZGlnIC0xIC8vIHR4bjogVHhuCglndHhucyBDbG9zZVJlbWFpbmRlclRvCglnbG9iYWwgWmVyb0FkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJ0eG4iLCJmaWVsZCI6ImNsb3NlUmVtYWluZGVyVG8iLCJleHBlY3RlZCI6Imdsb2JhbHMuemVyb0FkZHJlc3MifQoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIyLmFsZ28udHM6MTgKCS8vIHJldHVybiA8dWludDI1Nj50eG4uYW1vdW50OwoJZnJhbWVfZGlnIC0xIC8vIHR4bjogVHhuCglndHhucyBBbW91bnQKCWl0b2IKCWIgKnZlcmlmeURlcG9zaXRUeG4qcmV0dXJuCgliICppZjI0X2VuZAoKKmlmMjRfZWxzZWlmMV9jb25kaXRpb246CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjIuYWxnby50czoyMAoJLy8gYXNzZXRUeXBlID09PSBBU0EKCWZyYW1lX2RpZyAtMiAvLyBhc3NldFR5cGU6IHVpbnQ4CglpbnQgMQoJPT0KCWJ6ICppZjI0X2Vsc2VpZjJfY29uZGl0aW9uCgoJLy8gKmlmMjRfZWxzZWlmMV9jb25zZXF1ZW50CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjIuYWxnby50czoyMgoJLy8gdmVyaWZ5VHhuKHR4biwgewoJLy8gICAgICAgICB0eXBlRW51bTogVHJhbnNhY3Rpb25UeXBlLkFzc2V0VHJhbnNmZXIsCgkvLyAgICAgICAgIHhmZXJBc3NldDogQXNzZXRJRC5mcm9tVWludDY0KGFzc2V0SWQpLAoJLy8gICAgICAgICBzZW5kZXI6IHRoaXMudHhuLnNlbmRlciwKCS8vICAgICAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgYXNzZXRBbW91bnQ6IHsgZ3JlYXRlclRoYW46IDAgfSwKCS8vICAgICAgICAgcmVrZXlUbzogZ2xvYmFscy56ZXJvQWRkcmVzcywKCS8vICAgICAgICAgYXNzZXRDbG9zZVRvOiBnbG9iYWxzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgfSkKCS8vIHZlcmlmeSB0eXBlRW51bQoJZnJhbWVfZGlnIC0xIC8vIHR4bjogVHhuCglndHhucyBUeXBlRW51bQoJaW50IGF4ZmVyCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoidHhuIiwiZmllbGQiOiJ0eXBlRW51bSIsImV4cGVjdGVkIjoiVHJhbnNhY3Rpb25UeXBlLkFzc2V0VHJhbnNmZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHhmZXJBc3NldAoJZnJhbWVfZGlnIC0xIC8vIHR4bjogVHhuCglndHhucyBYZmVyQXNzZXQKCWZyYW1lX2RpZyAtMyAvLyBhc3NldElkOiB1aW50NjQKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJ0eG4iLCJmaWVsZCI6InhmZXJBc3NldCIsImV4cGVjdGVkIjoiQXNzZXRJRC5mcm9tVWludDY0KGFzc2V0SWQpIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyB0eG46IFR4bgoJZ3R4bnMgU2VuZGVyCgl0eG4gU2VuZGVyCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoidHhuIiwiZmllbGQiOiJzZW5kZXIiLCJleHBlY3RlZCI6InRoaXMudHhuLnNlbmRlciJ9Cglhc3NlcnQKCgkvLyB2ZXJpZnkgYXNzZXRSZWNlaXZlcgoJZnJhbWVfZGlnIC0xIC8vIHR4bjogVHhuCglndHhucyBBc3NldFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InR4biIsImZpZWxkIjoiYXNzZXRSZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyB2ZXJpZnkgYXNzZXRBbW91bnQKCWZyYW1lX2RpZyAtMSAvLyB0eG46IFR4bgoJZ3R4bnMgQXNzZXRBbW91bnQKCWludCAwCgk+CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJ0eG4iLCJmaWVsZCI6ImFzc2V0QW1vdW50IiwiY29uZGl0aW9uIjoiZ3JlYXRlclRoYW4iLCJleHBlY3RlZCI6Ij4wIn0KCWFzc2VydAoKCS8vIHZlcmlmeSByZWtleVRvCglmcmFtZV9kaWcgLTEgLy8gdHhuOiBUeG4KCWd0eG5zIFJla2V5VG8KCWdsb2JhbCBaZXJvQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InR4biIsImZpZWxkIjoicmVrZXlUbyIsImV4cGVjdGVkIjoiZ2xvYmFscy56ZXJvQWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyB2ZXJpZnkgYXNzZXRDbG9zZVRvCglmcmFtZV9kaWcgLTEgLy8gdHhuOiBUeG4KCWd0eG5zIEFzc2V0Q2xvc2VUbwoJZ2xvYmFsIFplcm9BZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoidHhuIiwiZmllbGQiOiJhc3NldENsb3NlVG8iLCJleHBlY3RlZCI6Imdsb2JhbHMuemVyb0FkZHJlc3MifQoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIyLmFsZ28udHM6MzIKCS8vIHJldHVybiA8dWludDI1Nj50eG4uYXNzZXRBbW91bnQ7CglmcmFtZV9kaWcgLTEgLy8gdHhuOiBUeG4KCWd0eG5zIEFzc2V0QW1vdW50CglpdG9iCgliICp2ZXJpZnlEZXBvc2l0VHhuKnJldHVybgoJYiAqaWYyNF9lbmQKCippZjI0X2Vsc2VpZjJfY29uZGl0aW9uOgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIyLmFsZ28udHM6MzQKCS8vIGFzc2V0VHlwZSA9PT0gU01BUlQKCWZyYW1lX2RpZyAtMiAvLyBhc3NldFR5cGU6IHVpbnQ4CglpbnQgMgoJPT0KCWJ6ICppZjI0X2VuZAoKCS8vICppZjI0X2Vsc2VpZjJfY29uc2VxdWVudAoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIyLmFsZ28udHM6MzYKCS8vIHZlcmlmeVR4bih0eG4sIHsKCS8vICAgICAgICAgdHlwZUVudW06IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwsCgkvLyAgICAgICAgIG9uQ29tcGxldGlvbjogT25Db21wbGV0aW9uLk5vT3AsCgkvLyAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQoYXNzZXRJZCksCgkvLyAgICAgICAgIHNlbmRlcjogdGhpcy50eG4uc2VuZGVyLAoJLy8gICAgICAgICBsYXN0TG9nOiBoZXgoJzB4MTUxZjdjNzU4MCcpCgkvLyAgICAgICB9KQoJLy8gdmVyaWZ5IHR5cGVFbnVtCglmcmFtZV9kaWcgLTEgLy8gdHhuOiBUeG4KCWd0eG5zIFR5cGVFbnVtCglpbnQgYXBwbAoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InR4biIsImZpZWxkIjoidHlwZUVudW0iLCJleHBlY3RlZCI6IlRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IG9uQ29tcGxldGlvbgoJZnJhbWVfZGlnIC0xIC8vIHR4bjogVHhuCglndHhucyBPbkNvbXBsZXRpb24KCWludCAwIC8vIE5vT3AKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJ0eG4iLCJmaWVsZCI6Im9uQ29tcGxldGlvbiIsImV4cGVjdGVkIjoiT25Db21wbGV0aW9uLk5vT3AifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IGFwcGxpY2F0aW9uSUQKCWZyYW1lX2RpZyAtMSAvLyB0eG46IFR4bgoJZ3R4bnMgQXBwbGljYXRpb25JRAoJZnJhbWVfZGlnIC0zIC8vIGFzc2V0SWQ6IHVpbnQ2NAoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InR4biIsImZpZWxkIjoiYXBwbGljYXRpb25JRCIsImV4cGVjdGVkIjoiQXBwSUQuZnJvbVVpbnQ2NChhc3NldElkKSJ9Cglhc3NlcnQKCgkvLyB2ZXJpZnkgc2VuZGVyCglmcmFtZV9kaWcgLTEgLy8gdHhuOiBUeG4KCWd0eG5zIFNlbmRlcgoJdHhuIFNlbmRlcgoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InR4biIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJ0aGlzLnR4bi5zZW5kZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IGxhc3RMb2cKCWZyYW1lX2RpZyAtMSAvLyB0eG46IFR4bgoJZ3R4bnMgTGFzdExvZwoJYnl0ZSAweDE1MWY3Yzc1ODAKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJ0eG4iLCJmaWVsZCI6Imxhc3RMb2ciLCJleHBlY3RlZCI6ImhleCgnMHgxNTFmN2M3NTgwJykifQoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIyLmFsZ28udHM6NDMKCS8vIGFtb3VudDogdWludDI1NiA9IGNhc3RCeXRlczx1aW50MjU2Pih0eG4uYXBwbGljYXRpb25BcmdzWzJdKQoJZnJhbWVfZGlnIC0xIC8vIHR4bjogVHhuCglndHhucyBBcHBsaWNhdGlvbkFyZ3MgMgoJZnJhbWVfYnVyeSAwIC8vIGFtb3VudDogdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMi5hbGdvLnRzOjQ0CgkvLyBhc3NlcnQodHhuLmFwcGxpY2F0aW9uQXJnc1swXSA9PT0gbWV0aG9kKCdhcmMyMDBfdHJhbnNmZXIoYWRkcmVzcyx1aW50MjU2KWJvb2wnKSkKCWZyYW1lX2RpZyAtMSAvLyB0eG46IFR4bgoJZ3R4bnMgQXBwbGljYXRpb25BcmdzIDAKCW1ldGhvZCAiYXJjMjAwX3RyYW5zZmVyKGFkZHJlc3MsdWludDI1Nilib29sIgoJPT0KCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMi5hbGdvLnRzOjQ1CgkvLyBhc3NlcnQodHhuLmFwcGxpY2F0aW9uQXJnc1sxXSA9PT0gcmF3Qnl0ZXModGhpcy5hcHAuYWRkcmVzcykpCglmcmFtZV9kaWcgLTEgLy8gdHhuOiBUeG4KCWd0eG5zIEFwcGxpY2F0aW9uQXJncyAxCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMi5hbGdvLnRzOjQ2CgkvLyBhc3NlcnQoYW1vdW50ID4gPHVpbnQyNTY+MCkKCWZyYW1lX2RpZyAwIC8vIGFtb3VudDogdWludDI1NgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCWI+Cglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjIuYWxnby50czo0OAoJLy8gcmV0dXJuIGFtb3VudDsKCWZyYW1lX2RpZyAwIC8vIGFtb3VudDogdWludDI1NgoJYiAqdmVyaWZ5RGVwb3NpdFR4bipyZXR1cm4KCippZjI0X2VuZDoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMi5hbGdvLnRzOjUxCgkvLyBhc3NlcnQoMCkKCWludCAwCglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjIuYWxnby50czo1MgoJLy8gcmV0dXJuIDx1aW50MjU2PjA7CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoKKnZlcmlmeURlcG9zaXRUeG4qcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGFkZExpcXVpZGl0eSh0eG4sdHhuKWJvb2wKKmFiaV9yb3V0ZV9hZGRMaXF1aWRpdHk6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGJldGFUeG46IHR4bgoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCgoJLy8gYWxwaGFUeG46IHR4bgoJdHhuIEdyb3VwSW5kZXgKCWludCAyCgktCgoJLy8gZXhlY3V0ZSBhZGRMaXF1aWRpdHkodHhuLHR4bilib29sCgljYWxsc3ViIGFkZExpcXVpZGl0eQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBhZGRMaXF1aWRpdHkoYWxwaGFUeG46IFR4biwgYmV0YVR4bjogVHhuKTogYm9vbGVhbgphZGRMaXF1aWRpdHk6Cglwcm90byAyIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwCgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjIuYWxnby50czo1NgoJLy8gYWxwaGFUeG4udHlwZUVudW0gIT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKCWZyYW1lX2RpZyAtMSAvLyBhbHBoYVR4bjogVHhuCglndHhucyBUeXBlRW51bQoJaW50IGFwcGwKCSE9CglieiAqaWYyNV9lbmQKCgkvLyAqaWYyNV9jb25zZXF1ZW50CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMi9Qb29sMjIuYWxnby50czo1NwoJLy8gdGhpcy5leHRlbmRCdWRnZXQoKQoJY2FsbHN1YiBleHRlbmRCdWRnZXQKCippZjI1X2VuZDoKCS8vICppZjI2X2NvbmRpdGlvbgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIyLmFsZ28udHM6NjAKCS8vIGJldGFUeG4udHlwZUVudW0gIT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKCWZyYW1lX2RpZyAtMiAvLyBiZXRhVHhuOiBUeG4KCWd0eG5zIFR5cGVFbnVtCglpbnQgYXBwbAoJIT0KCWJ6ICppZjI2X2VuZAoKCS8vICppZjI2X2NvbnNlcXVlbnQKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMi5hbGdvLnRzOjYxCgkvLyB0aGlzLmV4dGVuZEJ1ZGdldCgpCgljYWxsc3ViIGV4dGVuZEJ1ZGdldAoKKmlmMjZfZW5kOgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIyLmFsZ28udHM6NjQKCS8vIGFscGhhQW1vdW50ID0gdGhpcy52ZXJpZnlEZXBvc2l0VHhuKGFscGhhVHhuLCB0aGlzLmFscGhhVHlwZS52YWx1ZSwgdGhpcy5hbHBoYUlkLnZhbHVlKQoJYnl0ZSAweDYxNmM3MDY4NjE1ZjY5NjQgLy8gImFscGhhX2lkIgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHg2MTZjNzA2ODYxNWY3NDc5NzA2NSAvLyAiYWxwaGFfdHlwZSIKCWFwcF9nbG9iYWxfZ2V0CglidG9pCglmcmFtZV9kaWcgLTEgLy8gYWxwaGFUeG46IFR4bgoJY2FsbHN1YiB2ZXJpZnlEZXBvc2l0VHhuCglmcmFtZV9idXJ5IDAgLy8gYWxwaGFBbW91bnQ6IHVuc2FmZSB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIyLmFsZ28udHM6NjUKCS8vIGJldGFBbW91bnQgPSB0aGlzLnZlcmlmeURlcG9zaXRUeG4oYmV0YVR4biwgdGhpcy5iZXRhVHlwZS52YWx1ZSwgdGhpcy5iZXRhSWQudmFsdWUpCglieXRlIDB4NjI2NTc0NjE1ZjY5NjQgLy8gImJldGFfaWQiCglhcHBfZ2xvYmFsX2dldAoJYnl0ZSAweDYyNjU3NDYxNWY3NDc5NzA2NSAvLyAiYmV0YV90eXBlIgoJYXBwX2dsb2JhbF9nZXQKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBiZXRhVHhuOiBUeG4KCWNhbGxzdWIgdmVyaWZ5RGVwb3NpdFR4bgoJZnJhbWVfYnVyeSAxIC8vIGJldGFBbW91bnQ6IHVuc2FmZSB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzIvUG9vbDIyLmFsZ28udHM6NjcKCS8vIGFzc2VydChhbHBoYUFtb3VudCA+IDx1aW50MjU2PjAgJiYgYmV0YUFtb3VudCA+IDx1aW50MjU2PjApCglmcmFtZV9kaWcgMCAvLyBhbHBoYUFtb3VudDogdW5zYWZlIHVpbnQyNTYKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCgliPgoJZHVwCglieiAqc2tpcF9hbmQ1CglmcmFtZV9kaWcgMSAvLyBiZXRhQW1vdW50OiB1bnNhZmUgdWludDI1NgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCWI+CgkmJgoKKnNraXBfYW5kNToKCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8yL1Bvb2wyMi5hbGdvLnRzOjY5CgkvLyByZXR1cm4gdGhpcy5oYW5kbGVBZGRMaXF1aWRpdHkoYWxwaGFBbW91bnQsIGJldGFBbW91bnQpOwoJZnJhbWVfZGlnIDEgLy8gYmV0YUFtb3VudDogdW5zYWZlIHVpbnQyNTYKCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIGJldGFBbW91bnQgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJZnJhbWVfZGlnIDAgLy8gYWxwaGFBbW91bnQ6IHVuc2FmZSB1aW50MjU2CglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyBhbHBoYUFtb3VudCBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCgljYWxsc3ViIGhhbmRsZUFkZExpcXVpZGl0eQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gY29tcHV0ZU91dFRva2VucyhhbHBoYUFtb3VudDogdWludDI1NiwgYWxwaGFTdXBwbHk6IHVpbnQyNTYsIGJldGFTdXBwbHk6IHVpbnQyNTYsIGZlZTogdWludDI1Nik6IHVpbnQyNTYKY29tcHV0ZU91dFRva2VuczoKCXByb3RvIDQgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czo3CgkvLyBmYWN0b3IgPSA8dWludDI1Nj5TQ0FMRSAtIGZlZQoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1YWYzMTA3YTQwMDAKCWZyYW1lX2RpZyAtNCAvLyBmZWU6IHVpbnQyNTYKCWItCglmcmFtZV9idXJ5IDAgLy8gZmFjdG9yOiB1bnNhZmUgdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjkKCS8vIG51bWVyYXRvciA9IDx1aW50PDUxMj4+YWxwaGFBbW91bnQgKiA8dWludDw1MTI+PmJldGFTdXBwbHkgKiA8dWludDw1MTI+PmZhY3RvcgoJZnJhbWVfZGlnIC0xIC8vIGFscGhhQW1vdW50OiB1aW50MjU2CglmcmFtZV9kaWcgLTMgLy8gYmV0YVN1cHBseTogdWludDI1NgoJYioKCWZyYW1lX2RpZyAwIC8vIGZhY3RvcjogdW5zYWZlIHVpbnQyNTYKCWIqCglmcmFtZV9idXJ5IDEgLy8gbnVtZXJhdG9yOiB1bnNhZmUgdWludDUxMgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjEwCgkvLyBkZW5vbWluYXRvciA9ICg8dWludDw1MTI+PmFscGhhQW1vdW50ICsgPHVpbnQ8NTEyPj5hbHBoYVN1cHBseSkgKiA8dWludDw1MTI+PlNDQUxFCglmcmFtZV9kaWcgLTEgLy8gYWxwaGFBbW91bnQ6IHVpbnQyNTYKCWZyYW1lX2RpZyAtMiAvLyBhbHBoYVN1cHBseTogdWludDI1NgoJYisKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVhZjMxMDdhNDAwMAoJYioKCWZyYW1lX2J1cnkgMiAvLyBkZW5vbWluYXRvcjogdW5zYWZlIHVpbnQ1MTIKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czoxMgoJLy8gcmV0dXJuIDx1aW50MjU2PihudW1lcmF0b3IgLyBkZW5vbWluYXRvcik7CglmcmFtZV9kaWcgMSAvLyBudW1lcmF0b3I6IHVuc2FmZSB1aW50NTEyCglmcmFtZV9kaWcgMiAvLyBkZW5vbWluYXRvcjogdW5zYWZlIHVpbnQ1MTIKCWIvCgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBoYW5kbGVTd2FwQWxwaGFUb0JldGEoYWxwaGFBbW91bnQ6IHVpbnQyNTYsIG1pbkJldGFBbW91bnQ6IHVpbnQyNTYpOiB1aW50MjU2CmhhbmRsZVN3YXBBbHBoYVRvQmV0YToKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDUKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czoxNgoJLy8gYWxwaGFCYWxhbmNlOiB1aW50MjU2ID0gdGhpcy5hbHBoYUJhbGFuY2UoKQoJY2FsbHN1YiBhbHBoYUJhbGFuY2UKCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIHRoaXMuYWxwaGFCYWxhbmNlKCkgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJZnJhbWVfYnVyeSAwIC8vIGFscGhhQmFsYW5jZTogdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjE3CgkvLyBiZXRhQmFsYW5jZTogdWludDI1NiA9IHRoaXMuYmV0YUJhbGFuY2UoKQoJY2FsbHN1YiBiZXRhQmFsYW5jZQoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9CgoJLy8gdGhpcy5iZXRhQmFsYW5jZSgpIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWZyYW1lX2J1cnkgMSAvLyBiZXRhQmFsYW5jZTogdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjE4CgkvLyBhc3NlcnQoYWxwaGFCYWxhbmNlID4gMCkKCWZyYW1lX2RpZyAwIC8vIGFscGhhQmFsYW5jZTogdWludDI1NgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCWI+Cglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czoxOQoJLy8gYXNzZXJ0KGJldGFCYWxhbmNlID4gbWluQmV0YUFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIGJldGFCYWxhbmNlOiB1aW50MjU2CglmcmFtZV9kaWcgLTIgLy8gbWluQmV0YUFtb3VudDogdWludDI1NgoJYj4KCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjIxCgkvLyBwbGF0Zm9ybUZlZSA9IHRoaXMuZmFjdG9yeS52YWx1ZS5nbG9iYWxTdGF0ZSgncGxhdGZvcm1fZmVlJykgYXMgdWludDI1NgoJYnl0ZSAweDY2NjE2Mzc0NmY3Mjc5IC8vICJmYWN0b3J5IgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHg3MDZjNjE3NDY2NmY3MjZkNWY2NjY1NjUgLy8gInBsYXRmb3JtX2ZlZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLmZhY3RvcnkudmFsdWUuZ2xvYmFsU3RhdGUoJ3BsYXRmb3JtX2ZlZScpCglhc3NlcnQKCWZyYW1lX2J1cnkgMiAvLyBwbGF0Zm9ybUZlZTogdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjIyCgkvLyBhbW91bnRPdXQ6IHVpbnQyNTYgPSB0aGlzLmNvbXB1dGVPdXRUb2tlbnMoCgkvLyAgICAgICBhbHBoYUFtb3VudCwKCS8vICAgICAgIGFscGhhQmFsYW5jZSAtIGFscGhhQW1vdW50LAoJLy8gICAgICAgYmV0YUJhbGFuY2UsCgkvLyAgICAgICB0aGlzLnN3YXBGZWUudmFsdWUgKyBwbGF0Zm9ybUZlZQoJLy8gICAgICkKCWJ5dGUgMHg3Mzc3NjE3MDVmNjY2NTY1IC8vICJzd2FwX2ZlZSIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgMiAvLyBwbGF0Zm9ybUZlZTogdWludDI1NgoJYisKCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIHRoaXMuc3dhcEZlZS52YWx1ZSArIHBsYXRmb3JtRmVlIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAxIC8vIGJldGFCYWxhbmNlOiB1aW50MjU2CglmcmFtZV9kaWcgMCAvLyBhbHBoYUJhbGFuY2U6IHVpbnQyNTYKCWZyYW1lX2RpZyAtMSAvLyBhbHBoYUFtb3VudDogdWludDI1NgoJYi0KCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIGFscGhhQmFsYW5jZSAtIGFscGhhQW1vdW50IG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAtMSAvLyBhbHBoYUFtb3VudDogdWludDI1NgoJY2FsbHN1YiBjb21wdXRlT3V0VG9rZW5zCglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyB0aGlzLmNvbXB1dGVPdXRUb2tlbnMoXG4gICAgICBhbHBoYUFtb3VudCxcbiAgICAgIGFscGhhQmFsYW5jZSAtIGFscGhhQW1vdW50LFxuICAgICAgYmV0YUJhbGFuY2UsXG4gICAgICB0aGlzLnN3YXBGZWUudmFsdWUgKyBwbGF0Zm9ybUZlZVxuICAgICkgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJZnJhbWVfYnVyeSAzIC8vIGFtb3VudE91dDogdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjI4CgkvLyBhbW91bnRXT1BGZWU6IHVpbnQyNTYgPSB0aGlzLmNvbXB1dGVPdXRUb2tlbnMoCgkvLyAgICAgICBhbHBoYUFtb3VudCwKCS8vICAgICAgIGFscGhhQmFsYW5jZSAtIGFscGhhQW1vdW50LAoJLy8gICAgICAgYmV0YUJhbGFuY2UsCgkvLyAgICAgICB0aGlzLnN3YXBGZWUudmFsdWUKCS8vICAgICApCglieXRlIDB4NzM3NzYxNzA1ZjY2NjU2NSAvLyAic3dhcF9mZWUiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIDEgLy8gYmV0YUJhbGFuY2U6IHVpbnQyNTYKCWZyYW1lX2RpZyAwIC8vIGFscGhhQmFsYW5jZTogdWludDI1NgoJZnJhbWVfZGlnIC0xIC8vIGFscGhhQW1vdW50OiB1aW50MjU2CgliLQoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9CgoJLy8gYWxwaGFCYWxhbmNlIC0gYWxwaGFBbW91bnQgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJZnJhbWVfZGlnIC0xIC8vIGFscGhhQW1vdW50OiB1aW50MjU2CgljYWxsc3ViIGNvbXB1dGVPdXRUb2tlbnMKCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIHRoaXMuY29tcHV0ZU91dFRva2VucyhcbiAgICAgIGFscGhhQW1vdW50LFxuICAgICAgYWxwaGFCYWxhbmNlIC0gYWxwaGFBbW91bnQsXG4gICAgICBiZXRhQmFsYW5jZSxcbiAgICAgIHRoaXMuc3dhcEZlZS52YWx1ZVxuICAgICkgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJZnJhbWVfYnVyeSA0IC8vIGFtb3VudFdPUEZlZTogdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjM0CgkvLyBwbGF0Zm9ybUZlZUFtdCA9IDx1aW50MjU2Pig8dWludDI1Nj5hbW91bnRXT1BGZWUgLSA8dWludDI1Nj5hbW91bnRPdXQpCglmcmFtZV9kaWcgNCAvLyBhbW91bnRXT1BGZWU6IHVpbnQyNTYKCWZyYW1lX2RpZyAzIC8vIGFtb3VudE91dDogdWludDI1NgoJYi0KCWZyYW1lX2J1cnkgNSAvLyBwbGF0Zm9ybUZlZUFtdDogdW5zYWZlIHVpbnQyNTYKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czozNQoJLy8gYXNzZXJ0KGFtb3VudE91dCA+PSBtaW5CZXRhQW1vdW50KQoJZnJhbWVfZGlnIDMgLy8gYW1vdW50T3V0OiB1aW50MjU2CglmcmFtZV9kaWcgLTIgLy8gbWluQmV0YUFtb3VudDogdWludDI1NgoJYj49Cglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czozNgoJLy8gYXNzZXJ0KGFtb3VudE91dCA8IGJldGFCYWxhbmNlKQoJZnJhbWVfZGlnIDMgLy8gYW1vdW50T3V0OiB1aW50MjU2CglmcmFtZV9kaWcgMSAvLyBiZXRhQmFsYW5jZTogdWludDI1NgoJYjwKCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjM3CgkvLyBhc3NlcnQodGhpcy5iZXRhVHJhbnNmZXIodGhpcy50eG4uc2VuZGVyLCBhbW91bnRPdXQpKQoJZnJhbWVfZGlnIDMgLy8gYW1vdW50T3V0OiB1aW50MjU2Cgl0eG4gU2VuZGVyCgljYWxsc3ViIGJldGFUcmFuc2ZlcgoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzMvUG9vbDMxLmFsZ28udHM6MzgKCS8vIGFzc2VydCh0aGlzLmJldGFUcmFuc2Zlcih0aGlzLmZhY3RvcnkudmFsdWUuYWRkcmVzcywgcGxhdGZvcm1GZWVBbXQpKQoJZnJhbWVfZGlnIDUgLy8gcGxhdGZvcm1GZWVBbXQ6IHVuc2FmZSB1aW50MjU2CglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyBwbGF0Zm9ybUZlZUFtdCBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCglieXRlIDB4NjY2MTYzNzQ2ZjcyNzkgLy8gImZhY3RvcnkiCglhcHBfZ2xvYmFsX2dldAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJcG9wCgljYWxsc3ViIGJldGFUcmFuc2ZlcgoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzMvUG9vbDMxLmFsZ28udHM6MzkKCS8vIHRoaXMuU3dhcC5sb2coewoJLy8gICAgICAgc2VuZGVyOiB0aGlzLnR4bi5zZW5kZXIsCgkvLyAgICAgICBpbkFtdHM6IFthbHBoYUFtb3VudCwgMF0sCgkvLyAgICAgICBvdXRBbXRzOiBbMCwgYW1vdW50T3V0XSwKCS8vICAgICAgIHBvb2xCYWxzOiBbYWxwaGFCYWxhbmNlLCA8dWludDI1Nj4oYmV0YUJhbGFuY2UgLSBhbW91bnRXT1BGZWUpXSwKCS8vICAgICB9KQoJYnl0ZSAweDcwNDhkMGVhIC8vIFN3YXAoYWRkcmVzcywodWludDI1Nix1aW50MjU2KSwodWludDI1Nix1aW50MjU2KSwodWludDI1Nix1aW50MjU2KSkKCXR4biBTZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBhbHBoYUFtb3VudDogdWludDI1NgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJZnJhbWVfZGlnIDMgLy8gYW1vdW50T3V0OiB1aW50MjU2Cgljb25jYXQKCWNvbmNhdAoJZnJhbWVfZGlnIDAgLy8gYWxwaGFCYWxhbmNlOiB1aW50MjU2CglmcmFtZV9kaWcgMSAvLyBiZXRhQmFsYW5jZTogdWludDI1NgoJZnJhbWVfZGlnIDQgLy8gYW1vdW50V09QRmVlOiB1aW50MjU2CgliLQoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9CgoJLy8gPHVpbnQyNTY+KGJldGFCYWxhbmNlIC0gYW1vdW50V09QRmVlKSBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCgljb25jYXQKCWNvbmNhdAoJY29uY2F0Cglsb2cKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czo0NQoJLy8gcmV0dXJuIGFtb3VudE91dDsKCWZyYW1lX2RpZyAzIC8vIGFtb3VudE91dDogdWludDI1NgoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gaGFuZGxlU3dhcEJldGFUb0FscGhhKGJldGFBbW91bnQ6IHVpbnQyNTYsIG1pbkFscGhhQW1vdW50OiB1aW50MjU2KTogdWludDI1NgpoYW5kbGVTd2FwQmV0YVRvQWxwaGE6Cglwcm90byAyIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA1CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzMvUG9vbDMxLmFsZ28udHM6NDkKCS8vIGFscGhhQmFsYW5jZTogdWludDI1NiA9IHRoaXMuYWxwaGFCYWxhbmNlKCkKCWNhbGxzdWIgYWxwaGFCYWxhbmNlCglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyB0aGlzLmFscGhhQmFsYW5jZSgpIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWZyYW1lX2J1cnkgMCAvLyBhbHBoYUJhbGFuY2U6IHVpbnQyNTYKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czo1MAoJLy8gYmV0YUJhbGFuY2U6IHVpbnQyNTYgPSB0aGlzLmJldGFCYWxhbmNlKCkKCWNhbGxzdWIgYmV0YUJhbGFuY2UKCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIHRoaXMuYmV0YUJhbGFuY2UoKSBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCglmcmFtZV9idXJ5IDEgLy8gYmV0YUJhbGFuY2U6IHVpbnQyNTYKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czo1MQoJLy8gYXNzZXJ0KGFscGhhQmFsYW5jZSA+IG1pbkFscGhhQW1vdW50KQoJZnJhbWVfZGlnIDAgLy8gYWxwaGFCYWxhbmNlOiB1aW50MjU2CglmcmFtZV9kaWcgLTIgLy8gbWluQWxwaGFBbW91bnQ6IHVpbnQyNTYKCWI+Cglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czo1MgoJLy8gYXNzZXJ0KGJldGFCYWxhbmNlID4gMCkKCWZyYW1lX2RpZyAxIC8vIGJldGFCYWxhbmNlOiB1aW50MjU2CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYj4KCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjU0CgkvLyBwbGF0Zm9ybUZlZSA9IHRoaXMuZmFjdG9yeS52YWx1ZS5nbG9iYWxTdGF0ZSgncGxhdGZvcm1fZmVlJykgYXMgdWludDI1NgoJYnl0ZSAweDY2NjE2Mzc0NmY3Mjc5IC8vICJmYWN0b3J5IgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHg3MDZjNjE3NDY2NmY3MjZkNWY2NjY1NjUgLy8gInBsYXRmb3JtX2ZlZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLmZhY3RvcnkudmFsdWUuZ2xvYmFsU3RhdGUoJ3BsYXRmb3JtX2ZlZScpCglhc3NlcnQKCWZyYW1lX2J1cnkgMiAvLyBwbGF0Zm9ybUZlZTogdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjU1CgkvLyBhbW91bnRPdXQ6IHVpbnQyNTYgPSB0aGlzLmNvbXB1dGVPdXRUb2tlbnMoCgkvLyAgICAgICBiZXRhQW1vdW50LAoJLy8gICAgICAgYmV0YUJhbGFuY2UgLSBiZXRhQW1vdW50LAoJLy8gICAgICAgYWxwaGFCYWxhbmNlLAoJLy8gICAgICAgdGhpcy5zd2FwRmVlLnZhbHVlICsgcGxhdGZvcm1GZWUKCS8vICAgICApCglieXRlIDB4NzM3NzYxNzA1ZjY2NjU2NSAvLyAic3dhcF9mZWUiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIDIgLy8gcGxhdGZvcm1GZWU6IHVpbnQyNTYKCWIrCglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyB0aGlzLnN3YXBGZWUudmFsdWUgKyBwbGF0Zm9ybUZlZSBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCglmcmFtZV9kaWcgMCAvLyBhbHBoYUJhbGFuY2U6IHVpbnQyNTYKCWZyYW1lX2RpZyAxIC8vIGJldGFCYWxhbmNlOiB1aW50MjU2CglmcmFtZV9kaWcgLTEgLy8gYmV0YUFtb3VudDogdWludDI1NgoJYi0KCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIGJldGFCYWxhbmNlIC0gYmV0YUFtb3VudCBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCglmcmFtZV9kaWcgLTEgLy8gYmV0YUFtb3VudDogdWludDI1NgoJY2FsbHN1YiBjb21wdXRlT3V0VG9rZW5zCglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyB0aGlzLmNvbXB1dGVPdXRUb2tlbnMoXG4gICAgICBiZXRhQW1vdW50LFxuICAgICAgYmV0YUJhbGFuY2UgLSBiZXRhQW1vdW50LFxuICAgICAgYWxwaGFCYWxhbmNlLFxuICAgICAgdGhpcy5zd2FwRmVlLnZhbHVlICsgcGxhdGZvcm1GZWVcbiAgICApIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWZyYW1lX2J1cnkgMyAvLyBhbW91bnRPdXQ6IHVpbnQyNTYKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czo2MQoJLy8gYW1vdW50V09QRmVlOiB1aW50MjU2ID0gdGhpcy5jb21wdXRlT3V0VG9rZW5zKAoJLy8gICAgICAgYmV0YUFtb3VudCwKCS8vICAgICAgIGJldGFCYWxhbmNlIC0gYmV0YUFtb3VudCwKCS8vICAgICAgIGFscGhhQmFsYW5jZSwKCS8vICAgICAgIHRoaXMuc3dhcEZlZS52YWx1ZQoJLy8gICAgICkKCWJ5dGUgMHg3Mzc3NjE3MDVmNjY2NTY1IC8vICJzd2FwX2ZlZSIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgMCAvLyBhbHBoYUJhbGFuY2U6IHVpbnQyNTYKCWZyYW1lX2RpZyAxIC8vIGJldGFCYWxhbmNlOiB1aW50MjU2CglmcmFtZV9kaWcgLTEgLy8gYmV0YUFtb3VudDogdWludDI1NgoJYi0KCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIGJldGFCYWxhbmNlIC0gYmV0YUFtb3VudCBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCglmcmFtZV9kaWcgLTEgLy8gYmV0YUFtb3VudDogdWludDI1NgoJY2FsbHN1YiBjb21wdXRlT3V0VG9rZW5zCglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyB0aGlzLmNvbXB1dGVPdXRUb2tlbnMoXG4gICAgICBiZXRhQW1vdW50LFxuICAgICAgYmV0YUJhbGFuY2UgLSBiZXRhQW1vdW50LFxuICAgICAgYWxwaGFCYWxhbmNlLFxuICAgICAgdGhpcy5zd2FwRmVlLnZhbHVlXG4gICAgKSBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCglmcmFtZV9idXJ5IDQgLy8gYW1vdW50V09QRmVlOiB1aW50MjU2CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzMvUG9vbDMxLmFsZ28udHM6NjcKCS8vIHBsYXRmb3JtRmVlQW10ID0gPHVpbnQyNTY+KDx1aW50MjU2PmFtb3VudFdPUEZlZSAtIDx1aW50MjU2PmFtb3VudE91dCkKCWZyYW1lX2RpZyA0IC8vIGFtb3VudFdPUEZlZTogdWludDI1NgoJZnJhbWVfZGlnIDMgLy8gYW1vdW50T3V0OiB1aW50MjU2CgliLQoJZnJhbWVfYnVyeSA1IC8vIHBsYXRmb3JtRmVlQW10OiB1bnNhZmUgdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjY4CgkvLyBhc3NlcnQoYW1vdW50T3V0ID49IG1pbkFscGhhQW1vdW50KQoJZnJhbWVfZGlnIDMgLy8gYW1vdW50T3V0OiB1aW50MjU2CglmcmFtZV9kaWcgLTIgLy8gbWluQWxwaGFBbW91bnQ6IHVpbnQyNTYKCWI+PQoJYXNzZXJ0CgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzMvUG9vbDMxLmFsZ28udHM6NjkKCS8vIGFzc2VydChhbW91bnRPdXQgPCBhbHBoYUJhbGFuY2UpCglmcmFtZV9kaWcgMyAvLyBhbW91bnRPdXQ6IHVpbnQyNTYKCWZyYW1lX2RpZyAwIC8vIGFscGhhQmFsYW5jZTogdWludDI1NgoJYjwKCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjcwCgkvLyBhc3NlcnQodGhpcy5hbHBoYVRyYW5zZmVyKHRoaXMudHhuLnNlbmRlciwgYW1vdW50T3V0KSkKCWZyYW1lX2RpZyAzIC8vIGFtb3VudE91dDogdWludDI1NgoJdHhuIFNlbmRlcgoJY2FsbHN1YiBhbHBoYVRyYW5zZmVyCglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czo3MQoJLy8gYXNzZXJ0KHRoaXMuYWxwaGFUcmFuc2Zlcih0aGlzLmZhY3RvcnkudmFsdWUuYWRkcmVzcywgcGxhdGZvcm1GZWVBbXQpKQoJZnJhbWVfZGlnIDUgLy8gcGxhdGZvcm1GZWVBbXQ6IHVuc2FmZSB1aW50MjU2CglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyBwbGF0Zm9ybUZlZUFtdCBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCglieXRlIDB4NjY2MTYzNzQ2ZjcyNzkgLy8gImZhY3RvcnkiCglhcHBfZ2xvYmFsX2dldAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJcG9wCgljYWxsc3ViIGFscGhhVHJhbnNmZXIKCWFzc2VydAoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMS5hbGdvLnRzOjcyCgkvLyB0aGlzLlN3YXAubG9nKHsKCS8vICAgICAgIHNlbmRlcjogdGhpcy50eG4uc2VuZGVyLAoJLy8gICAgICAgaW5BbXRzOiBbMCwgYmV0YUFtb3VudF0sCgkvLyAgICAgICBvdXRBbXRzOiBbYW1vdW50T3V0LCAwXSwKCS8vICAgICAgIHBvb2xCYWxzOiBbPHVpbnQyNTY+KGFscGhhQmFsYW5jZSAtIGFtb3VudFdPUEZlZSksIGJldGFCYWxhbmNlXSwKCS8vICAgICB9KQoJYnl0ZSAweDcwNDhkMGVhIC8vIFN3YXAoYWRkcmVzcywodWludDI1Nix1aW50MjU2KSwodWludDI1Nix1aW50MjU2KSwodWludDI1Nix1aW50MjU2KSkKCXR4biBTZW5kZXIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCglmcmFtZV9kaWcgLTEgLy8gYmV0YUFtb3VudDogdWludDI1NgoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2RpZyAzIC8vIGFtb3VudE91dDogdWludDI1NgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyBhbHBoYUJhbGFuY2U6IHVpbnQyNTYKCWZyYW1lX2RpZyA0IC8vIGFtb3VudFdPUEZlZTogdWludDI1NgoJYi0KCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIDx1aW50MjU2PihhbHBoYUJhbGFuY2UgLSBhbW91bnRXT1BGZWUpIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAxIC8vIGJldGFCYWxhbmNlOiB1aW50MjU2Cgljb25jYXQKCWNvbmNhdAoJY29uY2F0Cglsb2cKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzEuYWxnby50czo3OAoJLy8gcmV0dXJuIGFtb3VudE91dDsKCWZyYW1lX2RpZyAzIC8vIGFtb3VudE91dDogdWludDI1NgoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gc3dhcEFscGhhVG9CZXRhKHR4bix1aW50MjU2KXVpbnQyNTYKKmFiaV9yb3V0ZV9zd2FwQWxwaGFUb0JldGE6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIG1pbkJldGFBbW91bnQ6IHVpbnQyNTYKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAobWluQmV0YUFtb3VudCkgZm9yIHN3YXBBbHBoYVRvQmV0YSBtdXN0IGJlIGEgdWludDI1NgoJYXNzZXJ0CgoJLy8gYWxwaGFUeG46IHR4bgoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCgoJLy8gZXhlY3V0ZSBzd2FwQWxwaGFUb0JldGEodHhuLHVpbnQyNTYpdWludDI1NgoJY2FsbHN1YiBzd2FwQWxwaGFUb0JldGEKCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoKCS8vIHN3YXBBbHBoYVRvQmV0YSByZXR1cm4gdmFsdWUgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHN3YXBBbHBoYVRvQmV0YShhbHBoYVR4bjogVHhuLCBtaW5CZXRhQW1vdW50OiB1aW50MjU2KTogdWludDI1Ngpzd2FwQWxwaGFUb0JldGE6Cglwcm90byAyIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vICppZjI3X2NvbmRpdGlvbgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzMvUG9vbDMyLmFsZ28udHM6NgoJLy8gYWxwaGFUeG4udHlwZUVudW0gIT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKCWZyYW1lX2RpZyAtMSAvLyBhbHBoYVR4bjogVHhuCglndHhucyBUeXBlRW51bQoJaW50IGFwcGwKCSE9CglieiAqaWYyN19lbmQKCgkvLyAqaWYyN19jb25zZXF1ZW50CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzIuYWxnby50czo2CgkvLyB0aGlzLmV4dGVuZEJ1ZGdldCgpCgljYWxsc3ViIGV4dGVuZEJ1ZGdldAoKKmlmMjdfZW5kOgoJLy8gc3JjL2NvbnRyYWN0cy9wb29sLzMvUG9vbDMyLmFsZ28udHM6NwoJLy8gYWxwaGFBbW91bnQgPSB0aGlzLnZlcmlmeURlcG9zaXRUeG4oYWxwaGFUeG4sIHRoaXMuYWxwaGFUeXBlLnZhbHVlLCB0aGlzLmFscGhhSWQudmFsdWUpCglieXRlIDB4NjE2YzcwNjg2MTVmNjk2NCAvLyAiYWxwaGFfaWQiCglhcHBfZ2xvYmFsX2dldAoJYnl0ZSAweDYxNmM3MDY4NjE1Zjc0Nzk3MDY1IC8vICJhbHBoYV90eXBlIgoJYXBwX2dsb2JhbF9nZXQKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBhbHBoYVR4bjogVHhuCgljYWxsc3ViIHZlcmlmeURlcG9zaXRUeG4KCWZyYW1lX2J1cnkgMCAvLyBhbHBoYUFtb3VudDogdW5zYWZlIHVpbnQyNTYKCgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzIuYWxnby50czo5CgkvLyByZXR1cm4gdGhpcy5oYW5kbGVTd2FwQWxwaGFUb0JldGEoYWxwaGFBbW91bnQsIG1pbkJldGFBbW91bnQpOwoJZnJhbWVfZGlnIC0yIC8vIG1pbkJldGFBbW91bnQ6IHVpbnQyNTYKCWZyYW1lX2RpZyAwIC8vIGFscGhhQW1vdW50OiB1bnNhZmUgdWludDI1NgoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9CgoJLy8gYWxwaGFBbW91bnQgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY2FsbHN1YiBoYW5kbGVTd2FwQWxwaGFUb0JldGEKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gc3dhcEJldGFUb0FscGhhKHR4bix1aW50MjU2KXVpbnQyNTYKKmFiaV9yb3V0ZV9zd2FwQmV0YVRvQWxwaGE6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIG1pbkFscGhhQW1vdW50OiB1aW50MjU2Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG1pbkFscGhhQW1vdW50KSBmb3Igc3dhcEJldGFUb0FscGhhIG11c3QgYmUgYSB1aW50MjU2Cglhc3NlcnQKCgkvLyBiZXRhVHhuOiB0eG4KCXR4biBHcm91cEluZGV4CglpbnQgMQoJLQoKCS8vIGV4ZWN1dGUgc3dhcEJldGFUb0FscGhhKHR4bix1aW50MjU2KXVpbnQyNTYKCWNhbGxzdWIgc3dhcEJldGFUb0FscGhhCglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyBzd2FwQmV0YVRvQWxwaGEgcmV0dXJuIHZhbHVlIG92ZXJmbG93ZWQgMjU2IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMzIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBzd2FwQmV0YVRvQWxwaGEoYmV0YVR4bjogVHhuLCBtaW5BbHBoYUFtb3VudDogdWludDI1Nik6IHVpbnQyNTYKc3dhcEJldGFUb0FscGhhOgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCgkvLyAqaWYyOF9jb25kaXRpb24KCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMi5hbGdvLnRzOjEzCgkvLyBiZXRhVHhuLnR5cGVFbnVtICE9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCglmcmFtZV9kaWcgLTEgLy8gYmV0YVR4bjogVHhuCglndHhucyBUeXBlRW51bQoJaW50IGFwcGwKCSE9CglieiAqaWYyOF9lbmQKCgkvLyAqaWYyOF9jb25zZXF1ZW50CgkvLyBzcmMvY29udHJhY3RzL3Bvb2wvMy9Qb29sMzIuYWxnby50czoxMwoJLy8gdGhpcy5leHRlbmRCdWRnZXQoKQoJY2FsbHN1YiBleHRlbmRCdWRnZXQKCippZjI4X2VuZDoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMi5hbGdvLnRzOjE0CgkvLyBiZXRhQW1vdW50ID0gdGhpcy52ZXJpZnlEZXBvc2l0VHhuKGJldGFUeG4sIHRoaXMuYmV0YVR5cGUudmFsdWUsIHRoaXMuYmV0YUlkLnZhbHVlKQoJYnl0ZSAweDYyNjU3NDYxNWY2OTY0IC8vICJiZXRhX2lkIgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHg2MjY1NzQ2MTVmNzQ3OTcwNjUgLy8gImJldGFfdHlwZSIKCWFwcF9nbG9iYWxfZ2V0CglidG9pCglmcmFtZV9kaWcgLTEgLy8gYmV0YVR4bjogVHhuCgljYWxsc3ViIHZlcmlmeURlcG9zaXRUeG4KCWZyYW1lX2J1cnkgMCAvLyBiZXRhQW1vdW50OiB1bnNhZmUgdWludDI1NgoKCS8vIHNyYy9jb250cmFjdHMvcG9vbC8zL1Bvb2wzMi5hbGdvLnRzOjE2CgkvLyByZXR1cm4gdGhpcy5oYW5kbGVTd2FwQmV0YVRvQWxwaGEoYmV0YUFtb3VudCwgbWluQWxwaGFBbW91bnQpOwoJZnJhbWVfZGlnIC0yIC8vIG1pbkFscGhhQW1vdW50OiB1aW50MjU2CglmcmFtZV9kaWcgMCAvLyBiZXRhQW1vdW50OiB1bnNhZmUgdWludDI1NgoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9CgoJLy8gYmV0YUFtb3VudCBvdmVyZmxvd2VkIDI1NiBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCgljYWxsc3ViIGhhbmRsZVN3YXBCZXRhVG9BbHBoYQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsYWRkcmVzcyxieXRlWzMyXSxieXRlWzhdLHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDgsdWludDI1Nil2b2lkCiphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb246CgkvLyBzd2FwRmVlOiB1aW50MjU2Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA5CglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN3YXBGZWUpIGZvciBjcmVhdGVBcHBsaWNhdGlvbiBtdXN0IGJlIGEgdWludDI1NgoJYXNzZXJ0CgoJLy8gYmV0YVR5cGU6IHVpbnQ4Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA4CglkdXAKCWxlbgoJaW50IDEKCT09CgoJLy8gYXJndW1lbnQgMSAoYmV0YVR5cGUpIGZvciBjcmVhdGVBcHBsaWNhdGlvbiBtdXN0IGJlIGEgdWludDgKCWFzc2VydAoJYnRvaQoKCS8vIGJldGFJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA3CglidG9pCgoJLy8gYWxwaGFUeXBlOiB1aW50OAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJZHVwCglsZW4KCWludCAxCgk9PQoKCS8vIGFyZ3VtZW50IDMgKGFscGhhVHlwZSkgZm9yIGNyZWF0ZUFwcGxpY2F0aW9uIG11c3QgYmUgYSB1aW50OAoJYXNzZXJ0CglidG9pCgoJLy8gYWxwaGFJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gc3ltYm9sOiBieXRlWzhdCgl0eG5hIEFwcGxpY2F0aW9uQXJncyA0CglkdXAKCWxlbgoJaW50IDgKCT09CgoJLy8gYXJndW1lbnQgNSAoc3ltYm9sKSBmb3IgY3JlYXRlQXBwbGljYXRpb24gbXVzdCBiZSBhIGJ5dGVbOF0KCWFzc2VydAoKCS8vIG5hbWU6IGJ5dGVbMzJdCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDYgKG5hbWUpIGZvciBjcmVhdGVBcHBsaWNhdGlvbiBtdXN0IGJlIGEgYnl0ZVszMl0KCWFzc2VydAoKCS8vIG1hbmFnZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgNyAobWFuYWdlcikgZm9yIGNyZWF0ZUFwcGxpY2F0aW9uIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBmYWN0b3J5OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCxhZGRyZXNzLGJ5dGVbMzJdLGJ5dGVbOF0sdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50OCx1aW50MjU2KXZvaWQKCWNhbGxzdWIgY3JlYXRlQXBwbGljYXRpb24KCWludCAxCglyZXR1cm4KCi8vIGNyZWF0ZUFwcGxpY2F0aW9uKGZhY3Rvcnk6IEFwcElELCBtYW5hZ2VyOiBBZGRyZXNzLCBuYW1lOiBTdGF0aWNCeXRlczwzMj4sIHN5bWJvbDogU3RhdGljQnl0ZXM8OD4sIGFscGhhSWQ6IHVpbnQ2NCwgYWxwaGFUeXBlOiB1aW50OCwgYmV0YUlkOiB1aW50NjQsIGJldGFUeXBlOiB1aW50OCwgc3dhcEZlZTogdWludDI1Nik6IHZvaWQKY3JlYXRlQXBwbGljYXRpb246Cglwcm90byA5IDAKCgkvLyBzcmMvY29udHJhY3RzL1Bvb2wuYWxnby50czoxNgoJLy8gdGhpcy53YXJkZW4udmFsdWUgPSBtYW5hZ2VyCglieXRlIDB4Nzc2MTcyNjQ2NTZlIC8vICJ3YXJkZW4iCglmcmFtZV9kaWcgLTIgLy8gbWFuYWdlcjogQWRkcmVzcwoJYXBwX2dsb2JhbF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL1Bvb2wuYWxnby50czoxNwoJLy8gdGhpcy5uYW1lLnZhbHVlID0gbmFtZQoJYnl0ZSAweDZlNjE2ZDY1IC8vICJuYW1lIgoJZnJhbWVfZGlnIC0zIC8vIG5hbWU6IFN0YXRpY0J5dGVzPDMyPgoJYXBwX2dsb2JhbF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL1Bvb2wuYWxnby50czoxOAoJLy8gdGhpcy5zeW1ib2wudmFsdWUgPSBzeW1ib2wKCWJ5dGUgMHg3Mzc5NmQ2MjZmNmMgLy8gInN5bWJvbCIKCWZyYW1lX2RpZyAtNCAvLyBzeW1ib2w6IFN0YXRpY0J5dGVzPDg+CglhcHBfZ2xvYmFsX3B1dAoKCS8vIHNyYy9jb250cmFjdHMvUG9vbC5hbGdvLnRzOjE5CgkvLyB0aGlzLmRlY2ltYWxzLnZhbHVlID0gPHVpbnQ4PkRFQ0lNQUxTCglieXRlIDB4NjQ2NTYzNjk2ZDYxNmM3MyAvLyAiZGVjaW1hbHMiCglieXRlIDB4MDYKCWFwcF9nbG9iYWxfcHV0CgoJLy8gc3JjL2NvbnRyYWN0cy9Qb29sLmFsZ28udHM6MjAKCS8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgPSA8dWludDI1Nj5TQ0FMRSAqIDx1aW50MjU2PigxMCAqKiBERUNJTUFMUykKCWJ5dGUgMHg3NDZmNzQ2MTZjNWY3Mzc1NzA3MDZjNzkgLy8gInRvdGFsX3N1cHBseSIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWFmMzEwN2E0MDAwCglpbnQgMTAKCWludCA2CglleHAKCWl0b2IKCWIqCglkdXAKCWJpdGxlbgoJaW50IDI1NgoJPD0KCgkvLyA8dWludDI1Nj5TQ0FMRSAqIDx1aW50MjU2PigxMCAqKiBERUNJTUFMUykgb3ZlcmZsb3dlZCAyNTYgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJYXBwX2dsb2JhbF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL1Bvb2wuYWxnby50czoyMQoJLy8gdGhpcy5pbml0aWFsaXplZC52YWx1ZSA9IGZhbHNlCglieXRlIDB4Njk2ZTY5NzQ2OTYxNmM2OTdhNjU2NCAvLyAiaW5pdGlhbGl6ZWQiCglpbnQgMAoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWFwcF9nbG9iYWxfcHV0CgoJLy8gc3JjL2NvbnRyYWN0cy9Qb29sLmFsZ28udHM6MjMKCS8vIHRoaXMuZmFjdG9yeS52YWx1ZSA9IGZhY3RvcnkKCWJ5dGUgMHg2NjYxNjM3NDZmNzI3OSAvLyAiZmFjdG9yeSIKCWZyYW1lX2RpZyAtMSAvLyBmYWN0b3J5OiBBcHBJRAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL1Bvb2wuYWxnby50czoyNAoJLy8gdGhpcy5hbHBoYUlkLnZhbHVlID0gYWxwaGFJZAoJYnl0ZSAweDYxNmM3MDY4NjE1ZjY5NjQgLy8gImFscGhhX2lkIgoJZnJhbWVfZGlnIC01IC8vIGFscGhhSWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL1Bvb2wuYWxnby50czoyNQoJLy8gdGhpcy5iZXRhSWQudmFsdWUgPSBiZXRhSWQKCWJ5dGUgMHg2MjY1NzQ2MTVmNjk2NCAvLyAiYmV0YV9pZCIKCWZyYW1lX2RpZyAtNyAvLyBiZXRhSWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL1Bvb2wuYWxnby50czoyNgoJLy8gdGhpcy5hbHBoYVR5cGUudmFsdWUgPSBhbHBoYVR5cGUKCWJ5dGUgMHg2MTZjNzA2ODYxNWY3NDc5NzA2NSAvLyAiYWxwaGFfdHlwZSIKCWZyYW1lX2RpZyAtNiAvLyBhbHBoYVR5cGU6IHVpbnQ4CglpdG9iCglleHRyYWN0IDcgMQoJYXBwX2dsb2JhbF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL1Bvb2wuYWxnby50czoyNwoJLy8gdGhpcy5iZXRhVHlwZS52YWx1ZSA9IGJldGFUeXBlCglieXRlIDB4NjI2NTc0NjE1Zjc0Nzk3MDY1IC8vICJiZXRhX3R5cGUiCglmcmFtZV9kaWcgLTggLy8gYmV0YVR5cGU6IHVpbnQ4CglpdG9iCglleHRyYWN0IDcgMQoJYXBwX2dsb2JhbF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL1Bvb2wuYWxnby50czoyOAoJLy8gdGhpcy5zd2FwRmVlLnZhbHVlID0gc3dhcEZlZQoJYnl0ZSAweDczNzc2MTcwNWY2NjY1NjUgLy8gInN3YXBfZmVlIgoJZnJhbWVfZGlnIC05IC8vIHN3YXBGZWU6IHVpbnQyNTYKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGJvb3RzdHJhcCgpdm9pZAoqYWJpX3JvdXRlX2Jvb3RzdHJhcDoKCS8vIGV4ZWN1dGUgYm9vdHN0cmFwKCl2b2lkCgljYWxsc3ViIGJvb3RzdHJhcAoJaW50IDEKCXJldHVybgoKLy8gYm9vdHN0cmFwKCk6IHZvaWQKYm9vdHN0cmFwOgoJcHJvdG8gMCAwCgoJLy8gc3JjL2NvbnRyYWN0cy9Qb29sLmFsZ28udHM6MzIKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMud2FyZGVuLnZhbHVlLCAnb25seSBtYW5hZ2VyIGNhbiBjYWxsIGJvb3RzdHJhcCcpCgl0eG4gU2VuZGVyCglieXRlIDB4Nzc2MTcyNjQ2NTZlIC8vICJ3YXJkZW4iCglhcHBfZ2xvYmFsX2dldAoJPT0KCgkvLyBvbmx5IG1hbmFnZXIgY2FuIGNhbGwgYm9vdHN0cmFwCglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL1Bvb2wuYWxnby50czozMwoJLy8gYXNzZXJ0KHRoaXMuaW5pdGlhbGl6ZWQudmFsdWUgIT09IHRydWUsICdhbHJlYWR5IGluaXRpYWxpemVkJykKCWJ5dGUgMHg2OTZlNjk3NDY5NjE2YzY5N2E2NTY0IC8vICJpbml0aWFsaXplZCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMAoJZ2V0Yml0CglpbnQgMQoJIT0KCgkvLyBhbHJlYWR5IGluaXRpYWxpemVkCglhc3NlcnQKCgkvLyBzcmMvY29udHJhY3RzL1Bvb2wuYWxnby50czozNAoJLy8gdGhpcy5pbml0aWFsaXplZC52YWx1ZSA9IHRydWUKCWJ5dGUgMHg2OTZlNjk3NDY5NjE2YzY5N2E2NTY0IC8vICJpbml0aWFsaXplZCIKCWludCAxCglieXRlIDB4MDAKCWludCAwCgl1bmNvdmVyIDIKCXNldGJpdAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBzcmMvY29udHJhY3RzL1Bvb2wuYWxnby50czozNQoJLy8gdGhpcy5iYWxhbmNlcyh0aGlzLmFwcC5hZGRyZXNzKS52YWx1ZSA9IHRoaXMudG90YWxTdXBwbHkudmFsdWUKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCglieXRlIDB4NzQ2Zjc0NjE2YzVmNzM3NTcwNzA2Yzc5IC8vICJ0b3RhbF9zdXBwbHkiCglhcHBfZ2xvYmFsX2dldAoJYm94X3B1dAoKCS8vICppZjI5X2NvbmRpdGlvbgoJLy8gc3JjL2NvbnRyYWN0cy9Qb29sLmFsZ28udHM6MzcKCS8vIHRoaXMuYWxwaGFUeXBlLnZhbHVlID09PSBBU0EKCWJ5dGUgMHg2MTZjNzA2ODYxNWY3NDc5NzA2NSAvLyAiYWxwaGFfdHlwZSIKCWFwcF9nbG9iYWxfZ2V0CglidG9pCglpbnQgMQoJPT0KCWJ6ICppZjI5X2VuZAoKCS8vICppZjI5X2NvbnNlcXVlbnQKCS8vIHNyYy9jb250cmFjdHMvUG9vbC5hbGdvLnRzOjM4CgkvLyBhc3NlcnQodGhpcy50cmFuc2ZlckFzYVRvKHRoaXMuYXBwLmFkZHJlc3MsIDx1aW50MjU2PjAsIHRoaXMuYWxwaGFJZC52YWx1ZSksICdvcHRpbiBmYWlsZWQnKQoJYnl0ZSAweDYxNmM3MDY4NjE1ZjY5NjQgLy8gImFscGhhX2lkIgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJY2FsbHN1YiB0cmFuc2ZlckFzYVRvCgoJLy8gb3B0aW4gZmFpbGVkCglhc3NlcnQKCippZjI5X2VuZDoKCS8vICppZjMwX2NvbmRpdGlvbgoJLy8gc3JjL2NvbnRyYWN0cy9Qb29sLmFsZ28udHM6NDAKCS8vIHRoaXMuYmV0YVR5cGUudmFsdWUgPT09IEFTQQoJYnl0ZSAweDYyNjU3NDYxNWY3NDc5NzA2NSAvLyAiYmV0YV90eXBlIgoJYXBwX2dsb2JhbF9nZXQKCWJ0b2kKCWludCAxCgk9PQoJYnogKmlmMzBfZW5kCgoJLy8gKmlmMzBfY29uc2VxdWVudAoJLy8gc3JjL2NvbnRyYWN0cy9Qb29sLmFsZ28udHM6NDEKCS8vIGFzc2VydCh0aGlzLnRyYW5zZmVyQXNhVG8odGhpcy5hcHAuYWRkcmVzcywgPHVpbnQyNTY+MCwgdGhpcy5iZXRhSWQudmFsdWUpLCAnb3B0aW4gZmFpbGVkJykKCWJ5dGUgMHg2MjY1NzQ2MTVmNjk2NCAvLyAiYmV0YV9pZCIKCWFwcF9nbG9iYWxfZ2V0CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWNhbGxzdWIgdHJhbnNmZXJBc2FUbwoKCS8vIG9wdGluIGZhaWxlZAoJYXNzZXJ0CgoqaWYzMF9lbmQ6CglyZXRzdWIKCipjcmVhdGVfTm9PcDoKCW1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24odWludDY0LGFkZHJlc3MsYnl0ZVszMl0sYnl0ZVs4XSx1aW50NjQsdWludDgsdWludDY0LHVpbnQ4LHVpbnQyNTYpdm9pZCIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoICphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb24KCgkvLyB0aGlzIGNvbnRyYWN0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgZ2l2ZW4gQUJJIG1ldGhvZCBmb3IgY3JlYXRlIE5vT3AKCWVycgoKKmNhbGxfTm9PcDoKCW1ldGhvZCAiYXJjMjAwX25hbWUoKWJ5dGVbMzJdIgoJbWV0aG9kICJhcmMyMDBfc3ltYm9sKClieXRlWzhdIgoJbWV0aG9kICJhcmMyMDBfZGVjaW1hbHMoKXVpbnQ4IgoJbWV0aG9kICJhcmMyMDBfdG90YWxTdXBwbHkoKXVpbnQyNTYiCgltZXRob2QgImFyYzIwMF9iYWxhbmNlT2YoYWRkcmVzcyl1aW50MjU2IgoJbWV0aG9kICJhcmMyMDBfYWxsb3dhbmNlKGFkZHJlc3MsYWRkcmVzcyl1aW50MjU2IgoJbWV0aG9kICJhcmMyMDBfdHJhbnNmZXIoYWRkcmVzcyx1aW50MjU2KWJvb2wiCgltZXRob2QgImFyYzIwMF9hcHByb3ZlKGFkZHJlc3MsdWludDI1Nilib29sIgoJbWV0aG9kICJhcmMyMDBfdHJhbnNmZXJGcm9tKGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2KWJvb2wiCgltZXRob2QgInN1cHBvcnRzSW50ZXJmYWNlKGJ5dGVbNF0pYm9vbCIKCW1ldGhvZCAiemVyb0FkZHJlc3MoKWFkZHJlc3MiCgltZXRob2QgImhhc0JveChhZGRyZXNzLGFkZHJlc3MpYm9vbCIKCW1ldGhvZCAiY3JlYXRlQmFsYW5jZUJveChhZGRyZXNzKWJvb2wiCgltZXRob2QgImNyZWF0ZUFsbG93YW5jZUJveChhZGRyZXNzLGFkZHJlc3MpYm9vbCIKCW1ldGhvZCAibm9vcCh1aW50NjQpdm9pZCIKCW1ldGhvZCAibWFuYWdlcigpYWRkcmVzcyIKCW1ldGhvZCAiZ3JhbnQoYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJzZXRGZWVzKHVpbnQyNTYpYm9vbCIKCW1ldGhvZCAicmVnaXN0ZXJPbmxpbmUoYnl0ZVtdLGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCW1ldGhvZCAicmVnaXN0ZXJPZmZsaW5lKCl2b2lkIgoJbWV0aG9kICJyZW1vdmVMaXF1aWRpdHkodWludDI1Nilib29sIgoJbWV0aG9kICJhZGRMaXF1aWRpdHkodHhuLHR4bilib29sIgoJbWV0aG9kICJzd2FwQWxwaGFUb0JldGEodHhuLHVpbnQyNTYpdWludDI1NiIKCW1ldGhvZCAic3dhcEJldGFUb0FscGhhKHR4bix1aW50MjU2KXVpbnQyNTYiCgltZXRob2QgImJvb3RzdHJhcCgpdm9pZCIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoICphYmlfcm91dGVfYXJjMjAwX25hbWUgKmFiaV9yb3V0ZV9hcmMyMDBfc3ltYm9sICphYmlfcm91dGVfYXJjMjAwX2RlY2ltYWxzICphYmlfcm91dGVfYXJjMjAwX3RvdGFsU3VwcGx5ICphYmlfcm91dGVfYXJjMjAwX2JhbGFuY2VPZiAqYWJpX3JvdXRlX2FyYzIwMF9hbGxvd2FuY2UgKmFiaV9yb3V0ZV9hcmMyMDBfdHJhbnNmZXIgKmFiaV9yb3V0ZV9hcmMyMDBfYXBwcm92ZSAqYWJpX3JvdXRlX2FyYzIwMF90cmFuc2ZlckZyb20gKmFiaV9yb3V0ZV9zdXBwb3J0c0ludGVyZmFjZSAqYWJpX3JvdXRlX3plcm9BZGRyZXNzICphYmlfcm91dGVfaGFzQm94ICphYmlfcm91dGVfY3JlYXRlQmFsYW5jZUJveCAqYWJpX3JvdXRlX2NyZWF0ZUFsbG93YW5jZUJveCAqYWJpX3JvdXRlX25vb3AgKmFiaV9yb3V0ZV9tYW5hZ2VyICphYmlfcm91dGVfZ3JhbnQgKmFiaV9yb3V0ZV9zZXRGZWVzICphYmlfcm91dGVfcmVnaXN0ZXJPbmxpbmUgKmFiaV9yb3V0ZV9yZWdpc3Rlck9mZmxpbmUgKmFiaV9yb3V0ZV9yZW1vdmVMaXF1aWRpdHkgKmFiaV9yb3V0ZV9hZGRMaXF1aWRpdHkgKmFiaV9yb3V0ZV9zd2FwQWxwaGFUb0JldGEgKmFiaV9yb3V0ZV9zd2FwQmV0YVRvQWxwaGEgKmFiaV9yb3V0ZV9ib290c3RyYXAKCgkvLyB0aGlzIGNvbnRyYWN0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgZ2l2ZW4gQUJJIG1ldGhvZCBmb3IgY2FsbCBOb09wCgllcnIKCipjYWxsX1VwZGF0ZUFwcGxpY2F0aW9uOgoJbWV0aG9kICJ1cGRhdGVBcHBsaWNhdGlvbigpdm9pZCIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoICphYmlfcm91dGVfdXBkYXRlQXBwbGljYXRpb24KCgkvLyB0aGlzIGNvbnRyYWN0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgZ2l2ZW4gQUJJIG1ldGhvZCBmb3IgY2FsbCBVcGRhdGVBcHBsaWNhdGlvbgoJZXJyCgoqY2FsbF9EZWxldGVBcHBsaWNhdGlvbjoKCW1ldGhvZCAiZGVsZXRlQXBwbGljYXRpb24oKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCAqYWJpX3JvdXRlX2RlbGV0ZUFwcGxpY2F0aW9uCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNhbGwgRGVsZXRlQXBwbGljYXRpb24KCWVycg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEw" }, "contract": { "name": "Pool", "desc": "", "methods": [ { "name": "arc200_name", "readonly": true, "args": [], "returns": { "type": "byte[32]" } }, { "name": "arc200_symbol", "readonly": true, "args": [], "returns": { "type": "byte[8]" } }, { "name": "arc200_decimals", "readonly": true, "args": [], "returns": { "type": "uint8" } }, { "name": "arc200_totalSupply", "readonly": true, "args": [], "returns": { "type": "uint256" } }, { "name": "arc200_balanceOf", "readonly": true, "args": [ { "name": "owner", "type": "address" } ], "returns": { "type": "uint256" } }, { "name": "arc200_allowance", "readonly": true, "args": [ { "name": "owner", "type": "address" }, { "name": "spender", "type": "address" } ], "returns": { "type": "uint256" } }, { "name": "arc200_transfer", "args": [ { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" } ], "returns": { "type": "bool" } }, { "name": "arc200_approve", "args": [ { "name": "spender", "type": "address" }, { "name": "value", "type": "uint256" } ], "returns": { "type": "bool" } }, { "name": "arc200_transferFrom", "args": [ { "name": "from", "type": "address" }, { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" } ], "returns": { "type": "bool" }, "events": [ { "name": "arc200_Transfer", "args": [ { "name": "from", "type": "address" }, { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" } ], "desc": "" } ] }, { "name": "supportsInterface", "readonly": true, "args": [ { "name": "interfaceID", "type": "byte[4]" } ], "returns": { "type": "bool" } }, { "name": "zeroAddress", "readonly": true, "args": [], "returns": { "type": "address" } }, { "name": "hasBox", "readonly": true, "args": [ { "name": "owner", "type": "address" }, { "name": "spender", "type": "address" } ], "returns": { "type": "bool" } }, { "name": "createBalanceBox", "args": [ { "name": "owner", "type": "address" } ], "returns": { "type": "bool" } }, { "name": "createAllowanceBox", "args": [ { "name": "owner", "type": "address" }, { "name": "spender", "type": "address" } ], "returns": { "type": "bool" } }, { "name": "noop", "args": [ { "name": "_n", "type": "uint64" } ], "returns": { "type": "void" } }, { "name": "updateApplication", "args": [], "returns": { "type": "void" } }, { "name": "deleteApplication", "args": [], "returns": { "type": "void" } }, { "name": "manager", "readonly": true, "args": [], "returns": { "type": "address" } }, { "name": "grant", "args": [ { "name": "manager", "type": "address" } ], "returns": { "type": "void" } }, { "name": "setFees", "args": [ { "name": "fee", "type": "uint256" } ], "returns": { "type": "bool" } }, { "name": "registerOnline", "args": [ { "name": "selectionPk", "type": "byte[]" }, { "name": "stateProofPk", "type": "byte[]" }, { "name": "votePk", "type": "byte[]" }, { "name": "voteFirst", "type": "uint64" }, { "name": "voteLast", "type": "uint64" }, { "name": "voteKeyDilution", "type": "uint64" } ], "returns": { "type": "void" } }, { "name": "registerOffline", "args": [], "returns": { "type": "void" } }, { "name": "removeLiquidity", "args": [ { "name": "lptAmount", "type": "uint256" } ], "returns": { "type": "bool" }, "events": [ { "name": "Withdraw", "args": [ { "name": "sender", "type": "address" }, { "name": "inLpt", "type": "uint256" }, { "name": "outAmts", "type": "(uint256,uint256)" }, { "name": "poolBals", "type": "(uint256,uint256)" } ], "desc": "" } ] }, { "name": "addLiquidity", "args": [ { "name": "alphaTxn", "type": "txn" }, { "name": "betaTxn", "type": "txn" } ], "returns": { "type": "bool" } }, { "name": "swapAlphaToBeta", "args": [ { "name": "alphaTxn", "type": "txn" }, { "name": "minBetaAmount", "type": "uint256" } ], "returns": { "type": "uint256" } }, { "name": "swapBetaToAlpha", "args": [ { "name": "betaTxn", "type": "txn" }, { "name": "minAlphaAmount", "type": "uint256" } ], "returns": { "type": "uint256" } }, { "name": "createApplication", "args": [ { "name": "factory", "type": "uint64" }, { "name": "manager", "type": "address" }, { "name": "name", "type": "byte[32]" }, { "name": "symbol", "type": "byte[8]" }, { "name": "alphaId", "type": "uint64" }, { "name": "alphaType", "type": "uint8" }, { "name": "betaId", "type": "uint64" }, { "name": "betaType", "type": "uint8" }, { "name": "swapFee", "type": "uint256" } ], "returns": { "type": "void" } }, { "name": "bootstrap", "args": [], "returns": { "type": "void" } } ], "events": [ { "name": "arc200_Transfer", "args": [ { "name": "from", "type": "address" }, { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" } ], "desc": "" }, { "name": "arc200_Approval", "args": [ { "name": "owner", "type": "address" }, { "name": "spender", "type": "address" }, { "name": "value", "type": "uint256" } ], "desc": "" }, { "name": "Swap", "args": [ { "name": "sender", "type": "address" }, { "name": "inAmts", "type": "(uint256,uint256)" }, { "name": "outAmts", "type": "(uint256,uint256)" }, { "name": "poolBals", "type": "(uint256,uint256)" } ], "desc": "" }, { "name": "Deposit", "args": [ { "name": "sender", "type": "address" }, { "name": "inAmts", "type": "(uint256,uint256)" }, { "name": "outLpt", "type": "uint256" }, { "name": "poolBals", "type": "(uint256,uint256)" } ], "desc": "" }, { "name": "Withdraw", "args": [ { "name": "sender", "type": "address" }, { "name": "inLpt", "type": "uint256" }, { "name": "outAmts", "type": "(uint256,uint256)" }, { "name": "poolBals", "type": "(uint256,uint256)" } ], "desc": "" } ] } } /** * Defines an onCompletionAction of 'no_op' */ export type OnCompleteNoOp = { onCompleteAction?: 'no_op' | OnApplicationComplete.NoOpOC } /** * Defines an onCompletionAction of 'opt_in' */ export type OnCompleteOptIn = { onCompleteAction: 'opt_in' | OnApplicationComplete.OptInOC } /** * Defines an onCompletionAction of 'close_out' */ export type OnCompleteCloseOut = { onCompleteAction: 'close_out' | OnApplicationComplete.CloseOutOC } /** * Defines an onCompletionAction of 'delete_application' */ export type OnCompleteDelApp = { onCompleteAction: 'delete_application' | OnApplicationComplete.DeleteApplicationOC } /** * Defines an onCompletionAction of 'update_application' */ export type OnCompleteUpdApp = { onCompleteAction: 'update_application' | OnApplicationComplete.UpdateApplicationOC } /** * A state record containing a single unsigned integer */ export type IntegerState = { /** * Gets the state value as a BigInt. */ asBigInt(): bigint /** * Gets the state value as a number. */ asNumber(): number } /** * A state record containing binary data */ export type BinaryState = { /** * Gets the state value as a Uint8Array */ asByteArray(): Uint8Array /** * Gets the state value as a string */ asString(): string } export type AppCreateCallTransactionResult = AppCallTransactionResult & Partial & AppReference export type AppUpdateCallTransactionResult = AppCallTransactionResult & Partial export type AppClientComposeCallCoreParams = Omit & { sendParams?: Omit } export type AppClientComposeExecuteParams = Pick export type IncludeSchema = { /** * Any overrides for the storage schema to request for the created app; by default the schema indicated by the app spec is used. */ schema?: Partial } /** * Defines the types of available calls and state of the Pool smart contract. */ export type Pool = { /** * Maps method signatures / names to their argument and return types. */ methods: & Record<'arc200_name()byte[32]' | 'arc200_name', { argsObj: { } argsTuple: [] returns: Uint8Array }> & Record<'arc200_symbol()byte[8]' | 'arc200_symbol', { argsObj: { } argsTuple: [] returns: Uint8Array }> & Record<'arc200_decimals()uint8' | 'arc200_decimals', { argsObj: { } argsTuple: [] returns: number }> & Record<'arc200_totalSupply()uint256' | 'arc200_totalSupply', { argsObj: { } argsTuple: [] returns: bigint }> & Record<'arc200_balanceOf(address)uint256' | 'arc200_balanceOf', { argsObj: { owner: string } argsTuple: [owner: string] returns: bigint }> & Record<'arc200_allowance(address,address)uint256' | 'arc200_allowance', { argsObj: { owner: string spender: string } argsTuple: [owner: string, spender: string] returns: bigint }> & Record<'arc200_transfer(address,uint256)bool' | 'arc200_transfer', { argsObj: { to: string value: bigint | number } argsTuple: [to: string, value: bigint | number] returns: boolean }> & Record<'arc200_approve(address,uint256)bool' | 'arc200_approve', { argsObj: { spender: string value: bigint | number } argsTuple: [spender: string, value: bigint | number] returns: boolean }> & Record<'arc200_transferFrom(address,address,uint256)bool' | 'arc200_transferFrom', { argsObj: { from: string to: string value: bigint | number } argsTuple: [from: string, to: string, value: bigint | number] returns: boolean }> & Record<'supportsInterface(byte[4])bool' | 'supportsInterface', { argsObj: { interfaceId: Uint8Array } argsTuple: [interfaceId: Uint8Array] returns: boolean }> & Record<'zeroAddress()address' | 'zeroAddress', { argsObj: { } argsTuple: [] returns: string }> & Record<'hasBox(address,address)bool' | 'hasBox', { argsObj: { owner: string spender: string } argsTuple: [owner: string, spender: string] returns: boolean }> & Record<'createBalanceBox(address)bool' | 'createBalanceBox', { argsObj: { owner: string } argsTuple: [owner: string] returns: boolean }> & Record<'createAllowanceBox(address,address)bool' | 'createAllowanceBox', { argsObj: { owner: string spender: string } argsTuple: [owner: string, spender: string] returns: boolean }> & Record<'noop(uint64)void' | 'noop', { argsObj: { n: bigint | number } argsTuple: [n: bigint | number] returns: void }> & Record<'updateApplication()void' | 'updateApplication', { argsObj: { } argsTuple: [] returns: void }> & Record<'deleteApplication()void' | 'deleteApplication', { argsObj: { } argsTuple: [] returns: void }> & Record<'manager()address' | 'manager', { argsObj: { } argsTuple: [] returns: string }> & Record<'grant(address)void' | 'grant', { argsObj: { manager: string } argsTuple: [manager: string] returns: void }> & Record<'setFees(uint256)bool' | 'setFees', { argsObj: { fee: bigint | number } argsTuple: [fee: bigint | number] returns: boolean }> & Record<'registerOnline(byte[],byte[],byte[],uint64,uint64,uint64)void' | 'registerOnline', { argsObj: { selectionPk: Uint8Array stateProofPk: Uint8Array votePk: Uint8Array voteFirst: bigint | number voteLast: bigint | number voteKeyDilution: bigint | number } argsTuple: [selectionPk: Uint8Array, stateProofPk: Uint8Array, votePk: Uint8Array, voteFirst: bigint | number, voteLast: bigint | number, voteKeyDilution: bigint | number] returns: void }> & Record<'registerOffline()void' | 'registerOffline', { argsObj: { } argsTuple: [] returns: void }> & Record<'removeLiquidity(uint256)bool' | 'removeLiquidity', { argsObj: { lptAmount: bigint | number } argsTuple: [lptAmount: bigint | number] returns: boolean }> & Record<'addLiquidity(txn,txn)bool' | 'addLiquidity', { argsObj: { alphaTxn: TransactionToSign | Transaction | Promise betaTxn: TransactionToSign | Transaction | Promise } argsTuple: [alphaTxn: TransactionToSign | Transaction | Promise, betaTxn: TransactionToSign | Transaction | Promise] returns: boolean }> & Record<'swapAlphaToBeta(txn,uint256)uint256' | 'swapAlphaToBeta', { argsObj: { alphaTxn: TransactionToSign | Transaction | Promise minBetaAmount: bigint | number } argsTuple: [alphaTxn: TransactionToSign | Transaction | Promise, minBetaAmount: bigint | number] returns: bigint }> & Record<'swapBetaToAlpha(txn,uint256)uint256' | 'swapBetaToAlpha', { argsObj: { betaTxn: TransactionToSign | Transaction | Promise minAlphaAmount: bigint | number } argsTuple: [betaTxn: TransactionToSign | Transaction | Promise, minAlphaAmount: bigint | number] returns: bigint }> & Record<'createApplication(uint64,address,byte[32],byte[8],uint64,uint8,uint64,uint8,uint256)void' | 'createApplication', { argsObj: { factory: bigint | number manager: string name: Uint8Array symbol: Uint8Array alphaId: bigint | number alphaType: number betaId: bigint | number betaType: number swapFee: bigint | number } argsTuple: [factory: bigint | number, manager: string, name: Uint8Array, symbol: Uint8Array, alphaId: bigint | number, alphaType: number, betaId: bigint | number, betaType: number, swapFee: bigint | number] returns: void }> & Record<'bootstrap()void' | 'bootstrap', { argsObj: { } argsTuple: [] returns: void }> /** * Defines the shape of the global and local state of the application. */ state: { global: { name?: BinaryState symbol?: BinaryState decimals?: BinaryState totalSupply?: BinaryState initialized?: BinaryState warden?: BinaryState factory?: IntegerState alphaId?: IntegerState betaId?: IntegerState alphaType?: BinaryState betaType?: BinaryState swapFee?: BinaryState } } } /** * Defines the possible abi call signatures */ export type PoolSig = keyof Pool['methods'] /** * Defines an object containing all relevant parameters for a single call to the contract. Where TSignature is undefined, a bare call is made */ export type TypedCallParams = { method: TSignature methodArgs: TSignature extends undefined ? undefined : Array } & AppClientCallCoreParams & CoreAppCallArgs /** * Defines the arguments required for a bare call */ export type BareCallArgs = Omit /** * Maps a method signature from the Pool smart contract to the method's arguments in either tuple of struct form */ export type MethodArgs = Pool['methods'][TSignature]['argsObj' | 'argsTuple'] /** * Maps a method signature from the Pool smart contract to the method's return type */ export type MethodReturn = Pool['methods'][TSignature]['returns'] /** * A factory for available 'create' calls */ export type PoolCreateCalls = (typeof PoolCallFactory)['create'] /** * Defines supported create methods for this smart contract */ export type PoolCreateCallParams = | (TypedCallParams<'createApplication(uint64,address,byte[32],byte[8],uint64,uint8,uint64,uint8,uint256)void'> & (OnCompleteNoOp)) /** * A factory for available 'update' calls */ export type PoolUpdateCalls = (typeof PoolCallFactory)['update'] /** * Defines supported update methods for this smart contract */ export type PoolUpdateCallParams = | TypedCallParams<'updateApplication()void'> /** * A factory for available 'delete' calls */ export type PoolDeleteCalls = (typeof PoolCallFactory)['delete'] /** * Defines supported delete methods for this smart contract */ export type PoolDeleteCallParams = | TypedCallParams<'deleteApplication()void'> /** * Defines arguments required for the deploy method. */ export type PoolDeployArgs = { deployTimeParams?: TealTemplateParams /** * A delegate which takes a create call factory and returns the create call params for this smart contract */ createCall?: (callFactory: PoolCreateCalls) => PoolCreateCallParams /** * A delegate which takes a update call factory and returns the update call params for this smart contract */ updateCall?: (callFactory: PoolUpdateCalls) => PoolUpdateCallParams /** * A delegate which takes a delete call factory and returns the delete call params for this smart contract */ deleteCall?: (callFactory: PoolDeleteCalls) => PoolDeleteCallParams } /** * Exposes methods for constructing all available smart contract calls */ export abstract class PoolCallFactory { /** * Gets available create call factories */ static get create() { return { /** * Constructs a create call for the Pool smart contract using the createApplication(uint64,address,byte[32],byte[8],uint64,uint8,uint64,uint8,uint256)void ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ createApplication(args: MethodArgs<'createApplication(uint64,address,byte[32],byte[8],uint64,uint8,uint64,uint8,uint256)void'>, params: AppClientCallCoreParams & CoreAppCallArgs & AppClientCompilationParams & (OnCompleteNoOp) = {}) { return { method: 'createApplication(uint64,address,byte[32],byte[8],uint64,uint8,uint64,uint8,uint256)void' as const, methodArgs: Array.isArray(args) ? args : [args.factory, args.manager, args.name, args.symbol, args.alphaId, args.alphaType, args.betaId, args.betaType, args.swapFee], ...params, } }, } } /** * Gets available update call factories */ static get update() { return { /** * Constructs an update call for the Pool smart contract using the updateApplication()void ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ updateApplication(args: MethodArgs<'updateApplication()void'>, params: AppClientCallCoreParams & CoreAppCallArgs & AppClientCompilationParams = {}) { return { method: 'updateApplication()void' as const, methodArgs: Array.isArray(args) ? args : [], ...params, } }, } } /** * Gets available delete call factories */ static get delete() { return { /** * Constructs a delete call for the Pool smart contract using the deleteApplication()void ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ deleteApplication(args: MethodArgs<'deleteApplication()void'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return { method: 'deleteApplication()void' as const, methodArgs: Array.isArray(args) ? args : [], ...params, } }, } } /** * Constructs a no op call for the arc200_name()byte[32] ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static arc200Name(args: MethodArgs<'arc200_name()byte[32]'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'arc200_name()byte[32]' as const, methodArgs: Array.isArray(args) ? args : [], ...params, } } /** * Constructs a no op call for the arc200_symbol()byte[8] ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static arc200Symbol(args: MethodArgs<'arc200_symbol()byte[8]'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'arc200_symbol()byte[8]' as const, methodArgs: Array.isArray(args) ? args : [], ...params, } } /** * Constructs a no op call for the arc200_decimals()uint8 ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static arc200Decimals(args: MethodArgs<'arc200_decimals()uint8'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'arc200_decimals()uint8' as const, methodArgs: Array.isArray(args) ? args : [], ...params, } } /** * Constructs a no op call for the arc200_totalSupply()uint256 ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static arc200TotalSupply(args: MethodArgs<'arc200_totalSupply()uint256'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'arc200_totalSupply()uint256' as const, methodArgs: Array.isArray(args) ? args : [], ...params, } } /** * Constructs a no op call for the arc200_balanceOf(address)uint256 ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static arc200BalanceOf(args: MethodArgs<'arc200_balanceOf(address)uint256'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'arc200_balanceOf(address)uint256' as const, methodArgs: Array.isArray(args) ? args : [args.owner], ...params, } } /** * Constructs a no op call for the arc200_allowance(address,address)uint256 ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static arc200Allowance(args: MethodArgs<'arc200_allowance(address,address)uint256'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'arc200_allowance(address,address)uint256' as const, methodArgs: Array.isArray(args) ? args : [args.owner, args.spender], ...params, } } /** * Constructs a no op call for the arc200_transfer(address,uint256)bool ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static arc200Transfer(args: MethodArgs<'arc200_transfer(address,uint256)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'arc200_transfer(address,uint256)bool' as const, methodArgs: Array.isArray(args) ? args : [args.to, args.value], ...params, } } /** * Constructs a no op call for the arc200_approve(address,uint256)bool ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static arc200Approve(args: MethodArgs<'arc200_approve(address,uint256)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'arc200_approve(address,uint256)bool' as const, methodArgs: Array.isArray(args) ? args : [args.spender, args.value], ...params, } } /** * Constructs a no op call for the arc200_transferFrom(address,address,uint256)bool ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static arc200TransferFrom(args: MethodArgs<'arc200_transferFrom(address,address,uint256)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'arc200_transferFrom(address,address,uint256)bool' as const, methodArgs: Array.isArray(args) ? args : [args.from, args.to, args.value], ...params, } } /** * Constructs a no op call for the supportsInterface(byte[4])bool ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static supportsInterface(args: MethodArgs<'supportsInterface(byte[4])bool'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'supportsInterface(byte[4])bool' as const, methodArgs: Array.isArray(args) ? args : [args.interfaceId], ...params, } } /** * Constructs a no op call for the zeroAddress()address ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static zeroAddress(args: MethodArgs<'zeroAddress()address'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'zeroAddress()address' as const, methodArgs: Array.isArray(args) ? args : [], ...params, } } /** * Constructs a no op call for the hasBox(address,address)bool ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static hasBox(args: MethodArgs<'hasBox(address,address)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'hasBox(address,address)bool' as const, methodArgs: Array.isArray(args) ? args : [args.owner, args.spender], ...params, } } /** * Constructs a no op call for the createBalanceBox(address)bool ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static createBalanceBox(args: MethodArgs<'createBalanceBox(address)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'createBalanceBox(address)bool' as const, methodArgs: Array.isArray(args) ? args : [args.owner], ...params, } } /** * Constructs a no op call for the createAllowanceBox(address,address)bool ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static createAllowanceBox(args: MethodArgs<'createAllowanceBox(address,address)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'createAllowanceBox(address,address)bool' as const, methodArgs: Array.isArray(args) ? args : [args.owner, args.spender], ...params, } } /** * Constructs a no op call for the noop(uint64)void ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static noop(args: MethodArgs<'noop(uint64)void'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'noop(uint64)void' as const, methodArgs: Array.isArray(args) ? args : [args.n], ...params, } } /** * Constructs a no op call for the manager()address ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static manager(args: MethodArgs<'manager()address'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'manager()address' as const, methodArgs: Array.isArray(args) ? args : [], ...params, } } /** * Constructs a no op call for the grant(address)void ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static grant(args: MethodArgs<'grant(address)void'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'grant(address)void' as const, methodArgs: Array.isArray(args) ? args : [args.manager], ...params, } } /** * Constructs a no op call for the setFees(uint256)bool ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static setFees(args: MethodArgs<'setFees(uint256)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'setFees(uint256)bool' as const, methodArgs: Array.isArray(args) ? args : [args.fee], ...params, } } /** * Constructs a no op call for the registerOnline(byte[],byte[],byte[],uint64,uint64,uint64)void ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static registerOnline(args: MethodArgs<'registerOnline(byte[],byte[],byte[],uint64,uint64,uint64)void'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'registerOnline(byte[],byte[],byte[],uint64,uint64,uint64)void' as const, methodArgs: Array.isArray(args) ? args : [args.selectionPk, args.stateProofPk, args.votePk, args.voteFirst, args.voteLast, args.voteKeyDilution], ...params, } } /** * Constructs a no op call for the registerOffline()void ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static registerOffline(args: MethodArgs<'registerOffline()void'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'registerOffline()void' as const, methodArgs: Array.isArray(args) ? args : [], ...params, } } /** * Constructs a no op call for the removeLiquidity(uint256)bool ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static removeLiquidity(args: MethodArgs<'removeLiquidity(uint256)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'removeLiquidity(uint256)bool' as const, methodArgs: Array.isArray(args) ? args : [args.lptAmount], ...params, } } /** * Constructs a no op call for the addLiquidity(txn,txn)bool ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static addLiquidity(args: MethodArgs<'addLiquidity(txn,txn)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'addLiquidity(txn,txn)bool' as const, methodArgs: Array.isArray(args) ? args : [args.alphaTxn, args.betaTxn], ...params, } } /** * Constructs a no op call for the swapAlphaToBeta(txn,uint256)uint256 ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static swapAlphaToBeta(args: MethodArgs<'swapAlphaToBeta(txn,uint256)uint256'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'swapAlphaToBeta(txn,uint256)uint256' as const, methodArgs: Array.isArray(args) ? args : [args.alphaTxn, args.minBetaAmount], ...params, } } /** * Constructs a no op call for the swapBetaToAlpha(txn,uint256)uint256 ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static swapBetaToAlpha(args: MethodArgs<'swapBetaToAlpha(txn,uint256)uint256'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'swapBetaToAlpha(txn,uint256)uint256' as const, methodArgs: Array.isArray(args) ? args : [args.betaTxn, args.minAlphaAmount], ...params, } } /** * Constructs a no op call for the bootstrap()void ABI method * * @param args Any args for the contract call * @param params Any additional parameters for the call * @returns A TypedCallParams object for the call */ static bootstrap(args: MethodArgs<'bootstrap()void'>, params: AppClientCallCoreParams & CoreAppCallArgs) { return { method: 'bootstrap()void' as const, methodArgs: Array.isArray(args) ? args : [], ...params, } } } /** * A client to make calls to the Pool smart contract */ export class PoolClient { /** * The underlying `ApplicationClient` for when you want to have more flexibility */ public readonly appClient: ApplicationClient private readonly sender: SendTransactionFrom | undefined /** * Creates a new instance of `PoolClient` * * @param appDetails appDetails The details to identify the app to deploy * @param algod An algod client instance */ constructor(appDetails: AppDetails, private algod: Algodv2) { this.sender = appDetails.sender this.appClient = algokit.getAppClient({ ...appDetails, app: APP_SPEC }, algod) } /** * Checks for decode errors on the AppCallTransactionResult and maps the return value to the specified generic type * * @param result The AppCallTransactionResult to be mapped * @param returnValueFormatter An optional delegate to format the return value if required * @returns The smart contract response with an updated return value */ protected mapReturnValue(result: AppCallTransactionResult, returnValueFormatter?: (value: any) => TReturn): AppCallTransactionResultOfType & TResult { if(result.return?.decodeError) { throw result.return.decodeError } const returnValue = result.return?.returnValue !== undefined && returnValueFormatter !== undefined ? returnValueFormatter(result.return.returnValue) : result.return?.returnValue as TReturn | undefined return { ...result, return: returnValue } as AppCallTransactionResultOfType & TResult } /** * Calls the ABI method with the matching signature using an onCompletion code of NO_OP * * @param typedCallParams An object containing the method signature, args, and any other relevant parameters * @param returnValueFormatter An optional delegate which when provided will be used to map non-undefined return values to the target type * @returns The result of the smart contract call */ public async call(typedCallParams: TypedCallParams, returnValueFormatter?: (value: any) => MethodReturn) { return this.mapReturnValue>(await this.appClient.call(typedCallParams), returnValueFormatter) } /** * Idempotently deploys the Pool smart contract. * * @param params The arguments for the contract calls and any additional parameters for the call * @returns The deployment result */ public deploy(params: PoolDeployArgs & AppClientDeployCoreParams & IncludeSchema = {}): ReturnType { const createArgs = params.createCall?.(PoolCallFactory.create) const updateArgs = params.updateCall?.(PoolCallFactory.update) const deleteArgs = params.deleteCall?.(PoolCallFactory.delete) return this.appClient.deploy({ ...params, updateArgs, deleteArgs, createArgs, createOnCompleteAction: createArgs?.onCompleteAction, }) } /** * Gets available create methods */ public get create() { const $this = this return { /** * Creates a new instance of the Pool smart contract using the createApplication(uint64,address,byte[32],byte[8],uint64,uint8,uint64,uint8,uint256)void ABI method. * * @param args The arguments for the smart contract call * @param params Any additional parameters for the call * @returns The create result */ async createApplication(args: MethodArgs<'createApplication(uint64,address,byte[32],byte[8],uint64,uint8,uint64,uint8,uint256)void'>, params: AppClientCallCoreParams & AppClientCompilationParams & IncludeSchema & CoreAppCallArgs & (OnCompleteNoOp) = {}) { return $this.mapReturnValue, AppCreateCallTransactionResult>(await $this.appClient.create(PoolCallFactory.create.createApplication(args, params))) }, } } /** * Gets available update methods */ public get update() { const $this = this return { /** * Updates an existing instance of the Pool smart contract using the updateApplication()void ABI method. * * @param args The arguments for the smart contract call * @param params Any additional parameters for the call * @returns The update result */ async updateApplication(args: MethodArgs<'updateApplication()void'>, params: AppClientCallCoreParams & AppClientCompilationParams & CoreAppCallArgs = {}) { return $this.mapReturnValue, AppUpdateCallTransactionResult>(await $this.appClient.update(PoolCallFactory.update.updateApplication(args, params))) }, } } /** * Gets available delete methods */ public get delete() { const $this = this return { /** * Deletes an existing instance of the Pool smart contract using the deleteApplication()void ABI method. * * @param args The arguments for the smart contract call * @param params Any additional parameters for the call * @returns The delete result */ async deleteApplication(args: MethodArgs<'deleteApplication()void'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return $this.mapReturnValue>(await $this.appClient.delete(PoolCallFactory.delete.deleteApplication(args, params))) }, } } /** * Makes a clear_state call to an existing instance of the Pool smart contract. * * @param args The arguments for the bare call * @returns The clear_state result */ public clearState(args: BareCallArgs & AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.appClient.clearState(args) } /** * Calls the arc200_name()byte[32] ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public arc200Name(args: MethodArgs<'arc200_name()byte[32]'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.arc200Name(args, params)) } /** * Calls the arc200_symbol()byte[8] ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public arc200Symbol(args: MethodArgs<'arc200_symbol()byte[8]'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.arc200Symbol(args, params)) } /** * Calls the arc200_decimals()uint8 ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public arc200Decimals(args: MethodArgs<'arc200_decimals()uint8'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.arc200Decimals(args, params)) } /** * Calls the arc200_totalSupply()uint256 ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public arc200TotalSupply(args: MethodArgs<'arc200_totalSupply()uint256'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.arc200TotalSupply(args, params)) } /** * Calls the arc200_balanceOf(address)uint256 ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public arc200BalanceOf(args: MethodArgs<'arc200_balanceOf(address)uint256'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.arc200BalanceOf(args, params)) } /** * Calls the arc200_allowance(address,address)uint256 ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public arc200Allowance(args: MethodArgs<'arc200_allowance(address,address)uint256'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.arc200Allowance(args, params)) } /** * Calls the arc200_transfer(address,uint256)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public arc200Transfer(args: MethodArgs<'arc200_transfer(address,uint256)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.arc200Transfer(args, params)) } /** * Calls the arc200_approve(address,uint256)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public arc200Approve(args: MethodArgs<'arc200_approve(address,uint256)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.arc200Approve(args, params)) } /** * Calls the arc200_transferFrom(address,address,uint256)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public arc200TransferFrom(args: MethodArgs<'arc200_transferFrom(address,address,uint256)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.arc200TransferFrom(args, params)) } /** * Calls the supportsInterface(byte[4])bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public supportsInterface(args: MethodArgs<'supportsInterface(byte[4])bool'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.supportsInterface(args, params)) } /** * Calls the zeroAddress()address ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public zeroAddress(args: MethodArgs<'zeroAddress()address'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.zeroAddress(args, params)) } /** * Calls the hasBox(address,address)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public hasBox(args: MethodArgs<'hasBox(address,address)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.hasBox(args, params)) } /** * Calls the createBalanceBox(address)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public createBalanceBox(args: MethodArgs<'createBalanceBox(address)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.createBalanceBox(args, params)) } /** * Calls the createAllowanceBox(address,address)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public createAllowanceBox(args: MethodArgs<'createAllowanceBox(address,address)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.createAllowanceBox(args, params)) } /** * Calls the noop(uint64)void ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public noop(args: MethodArgs<'noop(uint64)void'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.noop(args, params)) } /** * Calls the manager()address ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public manager(args: MethodArgs<'manager()address'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.manager(args, params)) } /** * Calls the grant(address)void ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public grant(args: MethodArgs<'grant(address)void'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.grant(args, params)) } /** * Calls the setFees(uint256)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public setFees(args: MethodArgs<'setFees(uint256)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.setFees(args, params)) } /** * Calls the registerOnline(byte[],byte[],byte[],uint64,uint64,uint64)void ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public registerOnline(args: MethodArgs<'registerOnline(byte[],byte[],byte[],uint64,uint64,uint64)void'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.registerOnline(args, params)) } /** * Calls the registerOffline()void ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public registerOffline(args: MethodArgs<'registerOffline()void'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.registerOffline(args, params)) } /** * Calls the removeLiquidity(uint256)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public removeLiquidity(args: MethodArgs<'removeLiquidity(uint256)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.removeLiquidity(args, params)) } /** * Calls the addLiquidity(txn,txn)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public addLiquidity(args: MethodArgs<'addLiquidity(txn,txn)bool'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.addLiquidity(args, params)) } /** * Calls the swapAlphaToBeta(txn,uint256)uint256 ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public swapAlphaToBeta(args: MethodArgs<'swapAlphaToBeta(txn,uint256)uint256'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.swapAlphaToBeta(args, params)) } /** * Calls the swapBetaToAlpha(txn,uint256)uint256 ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public swapBetaToAlpha(args: MethodArgs<'swapBetaToAlpha(txn,uint256)uint256'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.swapBetaToAlpha(args, params)) } /** * Calls the bootstrap()void ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The result of the call */ public bootstrap(args: MethodArgs<'bootstrap()void'>, params: AppClientCallCoreParams & CoreAppCallArgs = {}) { return this.call(PoolCallFactory.bootstrap(args, params)) } /** * Extracts a binary state value out of an AppState dictionary * * @param state The state dictionary containing the state value * @param key The key of the state value * @returns A BinaryState instance containing the state value, or undefined if the key was not found */ private static getBinaryState(state: AppState, key: string): BinaryState | undefined { const value = state[key] if (!value) return undefined if (!('valueRaw' in value)) throw new Error(`Failed to parse state value for ${key}; received an int when expected a byte array`) return { asString(): string { return value.value }, asByteArray(): Uint8Array { return value.valueRaw } } } /** * Extracts a integer state value out of an AppState dictionary * * @param state The state dictionary containing the state value * @param key The key of the state value * @returns An IntegerState instance containing the state value, or undefined if the key was not found */ private static getIntegerState(state: AppState, key: string): IntegerState | undefined { const value = state[key] if (!value) return undefined if ('valueRaw' in value) throw new Error(`Failed to parse state value for ${key}; received a byte array when expected a number`) return { asBigInt() { return typeof value.value === 'bigint' ? value.value : BigInt(value.value) }, asNumber(): number { return typeof value.value === 'bigint' ? Number(value.value) : value.value }, } } /** * Returns the smart contract's global state wrapped in a strongly typed accessor with options to format the stored value */ public async getGlobalState(): Promise { const state = await this.appClient.getGlobalState() return { get name() { return PoolClient.getBinaryState(state, 'name') }, get symbol() { return PoolClient.getBinaryState(state, 'symbol') }, get decimals() { return PoolClient.getBinaryState(state, 'decimals') }, get totalSupply() { return PoolClient.getBinaryState(state, 'total_supply') }, get initialized() { return PoolClient.getBinaryState(state, 'initialized') }, get warden() { return PoolClient.getBinaryState(state, 'warden') }, get factory() { return PoolClient.getIntegerState(state, 'factory') }, get alphaId() { return PoolClient.getIntegerState(state, 'alpha_id') }, get betaId() { return PoolClient.getIntegerState(state, 'beta_id') }, get alphaType() { return PoolClient.getBinaryState(state, 'alpha_type') }, get betaType() { return PoolClient.getBinaryState(state, 'beta_type') }, get swapFee() { return PoolClient.getBinaryState(state, 'swap_fee') }, } } public compose(): PoolComposer { const client = this const atc = new AtomicTransactionComposer() let promiseChain:Promise = Promise.resolve() const resultMappers: Array any)> = [] return { arc200Name(args: MethodArgs<'arc200_name()byte[32]'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.arc200Name(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, arc200Symbol(args: MethodArgs<'arc200_symbol()byte[8]'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.arc200Symbol(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, arc200Decimals(args: MethodArgs<'arc200_decimals()uint8'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.arc200Decimals(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, arc200TotalSupply(args: MethodArgs<'arc200_totalSupply()uint256'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.arc200TotalSupply(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, arc200BalanceOf(args: MethodArgs<'arc200_balanceOf(address)uint256'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.arc200BalanceOf(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, arc200Allowance(args: MethodArgs<'arc200_allowance(address,address)uint256'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.arc200Allowance(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, arc200Transfer(args: MethodArgs<'arc200_transfer(address,uint256)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.arc200Transfer(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, arc200Approve(args: MethodArgs<'arc200_approve(address,uint256)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.arc200Approve(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, arc200TransferFrom(args: MethodArgs<'arc200_transferFrom(address,address,uint256)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.arc200TransferFrom(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, supportsInterface(args: MethodArgs<'supportsInterface(byte[4])bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.supportsInterface(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, zeroAddress(args: MethodArgs<'zeroAddress()address'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.zeroAddress(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, hasBox(args: MethodArgs<'hasBox(address,address)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.hasBox(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, createBalanceBox(args: MethodArgs<'createBalanceBox(address)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.createBalanceBox(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, createAllowanceBox(args: MethodArgs<'createAllowanceBox(address,address)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.createAllowanceBox(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, noop(args: MethodArgs<'noop(uint64)void'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.noop(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, manager(args: MethodArgs<'manager()address'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.manager(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, grant(args: MethodArgs<'grant(address)void'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.grant(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, setFees(args: MethodArgs<'setFees(uint256)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.setFees(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, registerOnline(args: MethodArgs<'registerOnline(byte[],byte[],byte[],uint64,uint64,uint64)void'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.registerOnline(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, registerOffline(args: MethodArgs<'registerOffline()void'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.registerOffline(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, removeLiquidity(args: MethodArgs<'removeLiquidity(uint256)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.removeLiquidity(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, addLiquidity(args: MethodArgs<'addLiquidity(txn,txn)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.addLiquidity(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, swapAlphaToBeta(args: MethodArgs<'swapAlphaToBeta(txn,uint256)uint256'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.swapAlphaToBeta(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, swapBetaToAlpha(args: MethodArgs<'swapBetaToAlpha(txn,uint256)uint256'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.swapBetaToAlpha(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, bootstrap(args: MethodArgs<'bootstrap()void'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.bootstrap(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, get update() { const $this = this return { updateApplication(args: MethodArgs<'updateApplication()void'>, params?: AppClientComposeCallCoreParams & AppClientCompilationParams) { promiseChain = promiseChain.then(() => client.update.updateApplication(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return $this }, } }, get delete() { const $this = this return { deleteApplication(args: MethodArgs<'deleteApplication()void'>, params?: AppClientComposeCallCoreParams) { promiseChain = promiseChain.then(() => client.delete.deleteApplication(args, {...params, sendParams: {...params?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return $this }, } }, clearState(args?: BareCallArgs & AppClientComposeCallCoreParams & CoreAppCallArgs) { promiseChain = promiseChain.then(() => client.clearState({...args, sendParams: {...args?.sendParams, skipSending: true, atc}})) resultMappers.push(undefined) return this }, addTransaction(txn: TransactionWithSigner | TransactionToSign | Transaction | Promise, defaultSender?: SendTransactionFrom) { promiseChain = promiseChain.then(async () => atc.addTransaction(await algokit.getTransactionWithSigner(txn, defaultSender ?? client.sender))) return this }, async atc() { await promiseChain return atc }, async simulate(options?: SimulateOptions) { await promiseChain const result = await atc.simulate(client.algod, new modelsv2.SimulateRequest({ txnGroups: [], ...options })) return { ...result, returns: result.methodResults?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val.returnValue) : val.returnValue) } }, async execute(sendParams?: AppClientComposeExecuteParams) { await promiseChain const result = await algokit.sendAtomicTransactionComposer({ atc, sendParams }, client.algod) return { ...result, returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val.returnValue) : val.returnValue) } } } as unknown as PoolComposer } } export type PoolComposer = { /** * Calls the arc200_name()byte[32] ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ arc200Name(args: MethodArgs<'arc200_name()byte[32]'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'arc200_name()byte[32]'>]> /** * Calls the arc200_symbol()byte[8] ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ arc200Symbol(args: MethodArgs<'arc200_symbol()byte[8]'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'arc200_symbol()byte[8]'>]> /** * Calls the arc200_decimals()uint8 ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ arc200Decimals(args: MethodArgs<'arc200_decimals()uint8'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'arc200_decimals()uint8'>]> /** * Calls the arc200_totalSupply()uint256 ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ arc200TotalSupply(args: MethodArgs<'arc200_totalSupply()uint256'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'arc200_totalSupply()uint256'>]> /** * Calls the arc200_balanceOf(address)uint256 ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ arc200BalanceOf(args: MethodArgs<'arc200_balanceOf(address)uint256'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'arc200_balanceOf(address)uint256'>]> /** * Calls the arc200_allowance(address,address)uint256 ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ arc200Allowance(args: MethodArgs<'arc200_allowance(address,address)uint256'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'arc200_allowance(address,address)uint256'>]> /** * Calls the arc200_transfer(address,uint256)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ arc200Transfer(args: MethodArgs<'arc200_transfer(address,uint256)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'arc200_transfer(address,uint256)bool'>]> /** * Calls the arc200_approve(address,uint256)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ arc200Approve(args: MethodArgs<'arc200_approve(address,uint256)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'arc200_approve(address,uint256)bool'>]> /** * Calls the arc200_transferFrom(address,address,uint256)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ arc200TransferFrom(args: MethodArgs<'arc200_transferFrom(address,address,uint256)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'arc200_transferFrom(address,address,uint256)bool'>]> /** * Calls the supportsInterface(byte[4])bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ supportsInterface(args: MethodArgs<'supportsInterface(byte[4])bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'supportsInterface(byte[4])bool'>]> /** * Calls the zeroAddress()address ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ zeroAddress(args: MethodArgs<'zeroAddress()address'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'zeroAddress()address'>]> /** * Calls the hasBox(address,address)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ hasBox(args: MethodArgs<'hasBox(address,address)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'hasBox(address,address)bool'>]> /** * Calls the createBalanceBox(address)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ createBalanceBox(args: MethodArgs<'createBalanceBox(address)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'createBalanceBox(address)bool'>]> /** * Calls the createAllowanceBox(address,address)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ createAllowanceBox(args: MethodArgs<'createAllowanceBox(address,address)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'createAllowanceBox(address,address)bool'>]> /** * Calls the noop(uint64)void ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ noop(args: MethodArgs<'noop(uint64)void'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'noop(uint64)void'>]> /** * Calls the manager()address ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ manager(args: MethodArgs<'manager()address'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'manager()address'>]> /** * Calls the grant(address)void ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ grant(args: MethodArgs<'grant(address)void'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'grant(address)void'>]> /** * Calls the setFees(uint256)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ setFees(args: MethodArgs<'setFees(uint256)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'setFees(uint256)bool'>]> /** * Calls the registerOnline(byte[],byte[],byte[],uint64,uint64,uint64)void ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ registerOnline(args: MethodArgs<'registerOnline(byte[],byte[],byte[],uint64,uint64,uint64)void'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'registerOnline(byte[],byte[],byte[],uint64,uint64,uint64)void'>]> /** * Calls the registerOffline()void ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ registerOffline(args: MethodArgs<'registerOffline()void'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'registerOffline()void'>]> /** * Calls the removeLiquidity(uint256)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ removeLiquidity(args: MethodArgs<'removeLiquidity(uint256)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'removeLiquidity(uint256)bool'>]> /** * Calls the addLiquidity(txn,txn)bool ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ addLiquidity(args: MethodArgs<'addLiquidity(txn,txn)bool'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'addLiquidity(txn,txn)bool'>]> /** * Calls the swapAlphaToBeta(txn,uint256)uint256 ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ swapAlphaToBeta(args: MethodArgs<'swapAlphaToBeta(txn,uint256)uint256'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'swapAlphaToBeta(txn,uint256)uint256'>]> /** * Calls the swapBetaToAlpha(txn,uint256)uint256 ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ swapBetaToAlpha(args: MethodArgs<'swapBetaToAlpha(txn,uint256)uint256'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'swapBetaToAlpha(txn,uint256)uint256'>]> /** * Calls the bootstrap()void ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ bootstrap(args: MethodArgs<'bootstrap()void'>, params?: AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, MethodReturn<'bootstrap()void'>]> /** * Gets available update methods */ readonly update: { /** * Updates an existing instance of the Pool smart contract using the updateApplication()void ABI method. * * @param args The arguments for the smart contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ updateApplication(args: MethodArgs<'updateApplication()void'>, params?: AppClientComposeCallCoreParams & AppClientCompilationParams): PoolComposer<[...TReturns, MethodReturn<'updateApplication()void'>]> } /** * Gets available delete methods */ readonly delete: { /** * Deletes an existing instance of the Pool smart contract using the deleteApplication()void ABI method. * * @param args The arguments for the smart contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ deleteApplication(args: MethodArgs<'deleteApplication()void'>, params?: AppClientComposeCallCoreParams): PoolComposer<[...TReturns, MethodReturn<'deleteApplication()void'>]> } /** * Makes a clear_state call to an existing instance of the Pool smart contract. * * @param args The arguments for the bare call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ clearState(args?: BareCallArgs & AppClientComposeCallCoreParams & CoreAppCallArgs): PoolComposer<[...TReturns, undefined]> /** * Adds a transaction to the composer * * @param txn One of: A TransactionWithSigner object (returned as is), a TransactionToSign object (signer is obtained from the signer property), a Transaction object (signer is extracted from the defaultSender parameter), an async SendTransactionResult returned by one of algokit utils helpers (signer is obtained from the defaultSender parameter) * @param defaultSender The default sender to be used to obtain a signer where the object provided to the transaction parameter does not include a signer. */ addTransaction(txn: TransactionWithSigner | TransactionToSign | Transaction | Promise, defaultSender?: SendTransactionFrom): PoolComposer /** * Returns the underlying AtomicTransactionComposer instance */ atc(): Promise /** * Simulates the transaction group and returns the result */ simulate(options?: SimulateOptions): Promise> /** * Executes the transaction group and returns the results */ execute(sendParams?: AppClientComposeExecuteParams): Promise> } export type SimulateOptions = Omit[0], 'txnGroups'> export type PoolComposerSimulateResult = { returns: TReturns methodResults: ABIResult[] simulateResponse: modelsv2.SimulateResponse } export type PoolComposerResults = { returns: TReturns groupId: string txIds: string[] transactions: Transaction[] }