{ "name": "WenPadSale", "desc": "", "methods": [ { "name": "createApplication", "args": [ { "name": "saleId", "type": "uint64" }, { "name": "admin", "type": "address" }, { "name": "distribution", "type": "address" }, { "name": "price", "type": "uint64" }, { "name": "startRound", "type": "uint64" }, { "name": "endRound", "type": "uint64" }, { "name": "revealFee", "type": "uint64" }, { "name": "deliveryBudget", "type": "uint64" }, { "name": "router", "type": "uint64" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] } }, { "name": "setPayouts", "desc": "Called once by the factory right after creation (the app needs a balance to hold the box).", "args": [ { "name": "payouts", "type": "byte[]" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "addItems", "desc": "Append asset IDs to the sale list. The payment must cover the box MBR for any new pages.\nThe frontend should only pass assets the distribution wallet holds; any that are not\nheld at reveal time are skipped and dropped from the list.", "args": [ { "name": "mbrPay", "type": "pay" }, { "name": "assets", "type": "byte[]" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "register", "desc": "Go live. Must be followed in the same group by the distribution wallet's rekey to this\napp, or called after that rekey has happened. Either way the distribution wallet can\nsign both transactions in one prompt: [register(), pay 0 to self with rekeyTo=app].", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "pause", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "unpause", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "setPrice", "args": [ { "name": "price", "type": "uint64" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "setEndRound", "desc": "The end round can be moved but never removed, so the permissionless release always applies eventually.", "args": [ { "name": "endRound", "type": "uint64" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "commit", "desc": "Reserve one random item. Payment must cover the four line items:\n price - creator (held until reveal)\n revealFee - whoever calls reveal (keeper bounty)\n commit box MBR - refundable (2500 + 400 * (9-byte key + 72-byte Commit) = 34,900 today)\n deliveryBudget - refundable delivery deposit (direct refund or carried to the ARC-59 inbox)\nAnything paid above that is added to the refundable deposit. is the price the\nbuyer saw, so a price raised while the commit is in flight makes it fail instead of charging more.", "args": [ { "name": "payment", "type": "pay" }, { "name": "maxPrice", "type": "uint64" } ], "returns": { "type": "uint64" }, "events": [ { "name": "Committed", "args": [ { "name": "commitId", "type": "uint64" }, { "name": "buyer", "type": "address" }, { "name": "targetRound", "type": "uint64" } ], "desc": "" } ], "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "reveal", "desc": "Resolve a commit once its target round has passed. Callable by anyone, but only for the\ncommit at the head of the queue (), so every result is fixed by the block seeds\nalone, never by who reveals first. The caller receives revealFee as a bounty, which should\nexceed the pooled fees they pay for this call.\n\n\nSecurity invariant: once a draw is made, nothing the buyer controls can make this call\nfail. Otherwise a buyer could let unwanted draws expire and take the refund (free re-roll).\nSo every payment to the buyer goes either to an account that provably exists (opted in\nto the asset) or into the ARC-59 inbox, and the deposit floor covers the worst-case inbox.", "args": [ { "name": "commitId", "type": "uint64" } ], "returns": { "type": "void" }, "events": [ { "name": "Cancelled", "args": [ { "name": "commitId", "type": "uint64" }, { "name": "buyer", "type": "address" } ], "desc": "" }, { "name": "Revealed", "args": [ { "name": "commitId", "type": "uint64" }, { "name": "buyer", "type": "address" }, { "name": "asset", "type": "uint64" }, { "name": "inboxCost", "type": "uint64" } ], "desc": "" } ], "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "cancelExpired", "desc": "Refund a commit nobody revealed within REVEAL_WINDOW rounds (its block seed is no longer\nreadable). The reveal bounty makes it profitable for anyone to reveal long before this,\nand the buyer's own page reveals too.", "args": [ { "name": "commitId", "type": "uint64" } ], "returns": { "type": "void" }, "events": [ { "name": "Cancelled", "args": [ { "name": "commitId", "type": "uint64" }, { "name": "buyer", "type": "address" } ], "desc": "" } ], "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "release", "desc": "Rekey the distribution wallet back to itself. Requires no pending commits (pause first,\nthen let them be revealed). Allowed for the admin at any time, or for anyone once the\nsale has ended or sold out, so the wallet can never be stuck.", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "withdrawProceeds", "desc": "Split accumulated sale proceeds between the payout addresses. Callable by anyone.", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "deleteItemPage", "desc": "Free leftover item pages after release so the app can be deleted. Callable by anyone.", "args": [ { "name": "page", "type": "uint64" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "opUp", "desc": "No-op. Grouped alongside heavy calls (reveal) to pool extra opcode budget.", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] } }, { "name": "deleteApplication", "desc": "Called by the factory's deleteSale. Pays out proceeds, then closes the account to the\ndistribution wallet, which paid the deposits.", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "DeleteApplication" ] } } ], "events": [ { "name": "Committed", "args": [ { "name": "commitId", "type": "uint64" }, { "name": "buyer", "type": "address" }, { "name": "targetRound", "type": "uint64" } ], "desc": "" }, { "name": "Revealed", "args": [ { "name": "commitId", "type": "uint64" }, { "name": "buyer", "type": "address" }, { "name": "asset", "type": "uint64" }, { "name": "inboxCost", "type": "uint64" } ], "desc": "" }, { "name": "Cancelled", "args": [ { "name": "commitId", "type": "uint64" }, { "name": "buyer", "type": "address" } ], "desc": "" }, { "name": "Released", "args": [ { "name": "sold", "type": "uint64" }, { "name": "remaining", "type": "uint64" } ], "desc": "" } ], "arcs": [ 4, 56 ], "structs": { "Commit": [ { "name": "buyer", "type": "address" }, { "name": "targetRound", "type": "uint64" }, { "name": "price", "type": "uint64" }, { "name": "revealFee", "type": "uint64" }, { "name": "deposit", "type": "uint64" }, { "name": "boxMbr", "type": "uint64" } ] }, "state": { "schema": { "global": { "bytes": 2, "ints": 16 }, "local": { "bytes": 0, "ints": 0 } }, "keys": { "global": { "saleId": { "key": "c2FsZV9pZA==", "keyType": "AVMBytes", "valueType": "uint64" }, "factory": { "key": "ZmFjdG9yeQ==", "keyType": "AVMBytes", "valueType": "uint64" }, "router": { "key": "YXJjNTk=", "keyType": "AVMBytes", "valueType": "uint64" }, "admin": { "key": "YWRtaW4=", "keyType": "AVMBytes", "valueType": "address" }, "distribution": { "key": "ZGlzdHJpYnV0aW9u", "keyType": "AVMBytes", "valueType": "address" }, "price": { "key": "cHJpY2U=", "keyType": "AVMBytes", "valueType": "uint64" }, "startRound": { "key": "c3RhcnQ=", "keyType": "AVMBytes", "valueType": "uint64" }, "endRound": { "key": "ZW5k", "keyType": "AVMBytes", "valueType": "uint64" }, "revealFee": { "key": "cmV2ZWFsX2ZlZQ==", "keyType": "AVMBytes", "valueType": "uint64" }, "deliveryBudget": { "key": "ZGVsaXZlcnlfYnVkZ2V0", "keyType": "AVMBytes", "valueType": "uint64" }, "status": { "key": "c3RhdHVz", "keyType": "AVMBytes", "valueType": "uint64" }, "total": { "key": "dG90YWw=", "keyType": "AVMBytes", "valueType": "uint64" }, "remaining": { "key": "cmVtYWluaW5n", "keyType": "AVMBytes", "valueType": "uint64" }, "pending": { "key": "cGVuZGluZw==", "keyType": "AVMBytes", "valueType": "uint64" }, "sold": { "key": "c29sZA==", "keyType": "AVMBytes", "valueType": "uint64" }, "proceeds": { "key": "cHJvY2VlZHM=", "keyType": "AVMBytes", "valueType": "uint64" }, "nextCommit": { "key": "bmV4dF9jb21taXQ=", "keyType": "AVMBytes", "valueType": "uint64" }, "nextReveal": { "key": "bmV4dF9yZXZlYWw=", "keyType": "AVMBytes", "valueType": "uint64" } }, "local": {}, "box": { "payouts": { "key": "cA==", "keyType": "AVMBytes", "valueType": "AVMBytes" } } }, "maps": { "global": {}, "local": {}, "box": { "items": { "keyType": "uint64", "valueType": "AVMBytes", "prefix": "aQ==" }, "commits": { "keyType": "uint64", "valueType": "Commit", "prefix": "Yw==" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCmludGNibG9jayAwIDEgOCA0MCAzMiA0OCAxMjggMyA2IDEwMjQgMTAwMDAgMiA0IDU2IDY0CmJ5dGVjYmxvY2sgMHggMHg2MyAweDczNzQ2MTc0NzU3MyAweDcyNjU2ZDYxNjk2ZTY5NmU2NyAweDcwIDB4NzA2NTZlNjQ2OTZlNjcgMHg2NDY5NzM3NDcyNjk2Mjc1NzQ2OTZmNmUgMHg3MDcyNmY2MzY1NjU2NDczIDB4NjkgMHg2MTY0NmQ2OTZlIDB4NzM2ZjZjNjQgMHg2ZTY1Nzg3NDVmNzI2NTc2NjU2MTZjIDB4NjU2ZTY0IDB4NzA3MjY5NjM2NSAweDZlNjU3ODc0NWY2MzZmNmQ2ZDY5NzQgMHg3MzYxNmM2NTVmNjk2NCAweDY2NjE2Mzc0NmY3Mjc5IDB4NzM3NDYxNzI3NCAweDc0NmY3NDYxNmMgMHg2NDY1NmM2OTc2NjU3Mjc5NWY2Mjc1NjQ2NzY1NzQgMHg3MjY1NzY2NTYxNmM1ZjY2NjU2NSAweDYxNzI2MzM1MzkgMHgxNTFmN2M3NSAweDNlYWJhMWE5CgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwNy4yCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnRjIDggLy8gNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpjYWxsX0RlbGV0ZUFwcGxpY2F0aW9uICpjcmVhdGVfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQKCipOT1RfSU1QTEVNRU5URUQ6CgkvLyBUaGUgcmVxdWVzdGVkIGFjdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhpcyBjb250cmFjdC4gQXJlIHlvdSB1c2luZyB0aGUgY29ycmVjdCBPbkNvbXBsZXRlPyBEaWQgeW91IHNldCB5b3VyIGFwcCBJRD8KCWVycgoKLy8gY3JlYXRlQXBwbGljYXRpb24odWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb246CgkvLyByb3V0ZXI6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQoJYnRvaQoKCS8vIGRlbGl2ZXJ5QnVkZ2V0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDgKCWJ0b2kKCgkvLyByZXZlYWxGZWU6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwoJYnRvaQoKCS8vIGVuZFJvdW5kOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDYKCWJ0b2kKCgkvLyBzdGFydFJvdW5kOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWJ0b2kKCgkvLyBwcmljZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA0CglidG9pCgoJLy8gZGlzdHJpYnV0aW9uOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50YyA0IC8vIDMyCgk9PQoKCS8vIGFyZ3VtZW50IDYgKGRpc3RyaWJ1dGlvbikgZm9yIGNyZWF0ZUFwcGxpY2F0aW9uIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBhZG1pbjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJZHVwCglsZW4KCWludGMgNCAvLyAzMgoJPT0KCgkvLyBhcmd1bWVudCA3IChhZG1pbikgZm9yIGNyZWF0ZUFwcGxpY2F0aW9uIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBzYWxlSWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY3JlYXRlQXBwbGljYXRpb24odWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNyZWF0ZUFwcGxpY2F0aW9uCglpbnRjIDEgLy8gMQoJcmV0dXJuCgovLyBjcmVhdGVBcHBsaWNhdGlvbihzYWxlSWQ6IHVpbnQ2NCwgYWRtaW46IEFkZHJlc3MsIGRpc3RyaWJ1dGlvbjogQWRkcmVzcywgcHJpY2U6IHVpbnQ2NCwgc3RhcnRSb3VuZDogdWludDY0LCBlbmRSb3VuZDogdWludDY0LCByZXZlYWxGZWU6IHVpbnQ2NCwgZGVsaXZlcnlCdWRnZXQ6IHVpbnQ2NCwgcm91dGVyOiBBcHBJRCk6IHZvaWQKY3JlYXRlQXBwbGljYXRpb246Cglwcm90byA5IDAKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjE1MwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gZ2xvYmFscy5jYWxsZXJBcHBsaWNhdGlvbkFkZHJlc3MpCgl0eG4gU2VuZGVyCglnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25BZGRyZXNzCgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxNTUKCS8vIHRoaXMuc2FsZUlkLnZhbHVlID0gc2FsZUlkCglieXRlYyAxNSAvLyAgInNhbGVfaWQiCglmcmFtZV9kaWcgLTEgLy8gc2FsZUlkOiB1aW50NjQKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxNTYKCS8vIHRoaXMuZmFjdG9yeS52YWx1ZSA9IGdsb2JhbHMuY2FsbGVyQXBwbGljYXRpb25JRAoJYnl0ZWMgMTYgLy8gICJmYWN0b3J5IgoJZ2xvYmFsIENhbGxlckFwcGxpY2F0aW9uSUQKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxNTcKCS8vIHRoaXMucm91dGVyLnZhbHVlID0gcm91dGVyCglieXRlYyAyMSAvLyAgImFyYzU5IgoJZnJhbWVfZGlnIC05IC8vIHJvdXRlcjogQXBwSUQKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxNTgKCS8vIHRoaXMuYWRtaW4udmFsdWUgPSBhZG1pbgoJYnl0ZWMgOSAvLyAgImFkbWluIgoJZnJhbWVfZGlnIC0yIC8vIGFkbWluOiBBZGRyZXNzCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MTU5CgkvLyB0aGlzLmRpc3RyaWJ1dGlvbi52YWx1ZSA9IGRpc3RyaWJ1dGlvbgoJYnl0ZWMgNiAvLyAgImRpc3RyaWJ1dGlvbiIKCWZyYW1lX2RpZyAtMyAvLyBkaXN0cmlidXRpb246IEFkZHJlc3MKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxNjAKCS8vIHRoaXMucHJpY2UudmFsdWUgPSBwcmljZQoJYnl0ZWMgMTMgLy8gICJwcmljZSIKCWZyYW1lX2RpZyAtNCAvLyBwcmljZTogdWludDY0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MTYxCgkvLyB0aGlzLnN0YXJ0Um91bmQudmFsdWUgPSBzdGFydFJvdW5kCglieXRlYyAxNyAvLyAgInN0YXJ0IgoJZnJhbWVfZGlnIC01IC8vIHN0YXJ0Um91bmQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjE2MgoJLy8gdGhpcy5lbmRSb3VuZC52YWx1ZSA9IGVuZFJvdW5kCglieXRlYyAxMiAvLyAgImVuZCIKCWZyYW1lX2RpZyAtNiAvLyBlbmRSb3VuZDogdWludDY0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MTYzCgkvLyB0aGlzLnJldmVhbEZlZS52YWx1ZSA9IHJldmVhbEZlZQoJYnl0ZWMgMjAgLy8gICJyZXZlYWxfZmVlIgoJZnJhbWVfZGlnIC03IC8vIHJldmVhbEZlZTogdWludDY0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MTY0CgkvLyB0aGlzLmRlbGl2ZXJ5QnVkZ2V0LnZhbHVlID0gZGVsaXZlcnlCdWRnZXQKCWJ5dGVjIDE5IC8vICAiZGVsaXZlcnlfYnVkZ2V0IgoJZnJhbWVfZGlnIC04IC8vIGRlbGl2ZXJ5QnVkZ2V0OiB1aW50NjQKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxNjYKCS8vIHRoaXMuc3RhdHVzLnZhbHVlID0gU1RBVFVTX1NFVFVQCglieXRlYyAyIC8vICAic3RhdHVzIgoJaW50YyAwIC8vIDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxNjcKCS8vIHRoaXMudG90YWwudmFsdWUgPSAwCglieXRlYyAxOCAvLyAgInRvdGFsIgoJaW50YyAwIC8vIDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxNjgKCS8vIHRoaXMucmVtYWluaW5nLnZhbHVlID0gMAoJYnl0ZWMgMyAvLyAgInJlbWFpbmluZyIKCWludGMgMCAvLyAwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MTY5CgkvLyB0aGlzLnBlbmRpbmcudmFsdWUgPSAwCglieXRlYyA1IC8vICAicGVuZGluZyIKCWludGMgMCAvLyAwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MTcwCgkvLyB0aGlzLnNvbGQudmFsdWUgPSAwCglieXRlYyAxMCAvLyAgInNvbGQiCglpbnRjIDAgLy8gMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjE3MQoJLy8gdGhpcy5wcm9jZWVkcy52YWx1ZSA9IDAKCWJ5dGVjIDcgLy8gICJwcm9jZWVkcyIKCWludGMgMCAvLyAwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MTcyCgkvLyB0aGlzLm5leHRDb21taXQudmFsdWUgPSAxCglieXRlYyAxNCAvLyAgIm5leHRfY29tbWl0IgoJaW50YyAxIC8vIDEKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxNzMKCS8vIHRoaXMubmV4dFJldmVhbC52YWx1ZSA9IDEKCWJ5dGVjIDExIC8vICAibmV4dF9yZXZlYWwiCglpbnRjIDEgLy8gMQoJYXBwX2dsb2JhbF9wdXQKCXJldHN1YgoKLy8gc2V0UGF5b3V0cyhieXRlW10pdm9pZAoqYWJpX3JvdXRlX3NldFBheW91dHM6CgkvLyBwYXlvdXRzOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgoJLy8gZXhlY3V0ZSBzZXRQYXlvdXRzKGJ5dGVbXSl2b2lkCgljYWxsc3ViIHNldFBheW91dHMKCWludGMgMSAvLyAxCglyZXR1cm4KCi8vIHNldFBheW91dHMocGF5b3V0czogYnl0ZXMpOiB2b2lkCi8vCi8vIENhbGxlZCBvbmNlIGJ5IHRoZSBmYWN0b3J5IHJpZ2h0IGFmdGVyIGNyZWF0aW9uICh0aGUgYXBwIG5lZWRzIGEgYmFsYW5jZSB0byBob2xkIHRoZSBib3gpLgpzZXRQYXlvdXRzOgoJcHJvdG8gMSAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGVjIDAgLy8gMHgKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjE4MgoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gdGhpcy5hcHAuY3JlYXRvcikKCXR4biBTZW5kZXIKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKCXBvcAoJPT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MTgzCgkvLyBhc3NlcnQoIXRoaXMucGF5b3V0cy5leGlzdHMpCglieXRlYyA0IC8vICAicCIKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxODUKCS8vIHRoaXMucGF5b3V0cy5jcmVhdGUoKHBheW91dHMubGVuZ3RoIC8gUEFZT1VUX0VOVFJZX0JZVEVTKSAqIFBBWU9VVF9TVE9SRURfQllURVMpCglieXRlYyA0IC8vICAicCIKCWZyYW1lX2RpZyAtMSAvLyBwYXlvdXRzOiBieXRlcwoJbGVuCglpbnRjIDMgLy8gNDAKCS8KCWludGMgNSAvLyA0OAoJKgoJYm94X2NyZWF0ZQoJcG9wCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxODYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgcGF5b3V0cy5sZW5ndGg7IGkgPSBpICsgUEFZT1VUX0VOVFJZX0JZVEVTKQoJaW50YyAwIC8vIDAKCWZyYW1lX2J1cnkgMCAvLyBpOiB1aW50NjQKCipmb3JfMDoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MTg2CgkvLyBpIDwgcGF5b3V0cy5sZW5ndGgKCWZyYW1lX2RpZyAwIC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIC0xIC8vIHBheW91dHM6IGJ5dGVzCglsZW4KCTwKCWJ6ICpmb3JfMF9lbmQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjE4NwoJLy8gdGhpcy5wYXlvdXRzLnJlcGxhY2UoKGkgLyBQQVlPVVRfRU5UUllfQllURVMpICogUEFZT1VUX1NUT1JFRF9CWVRFUywgZXh0cmFjdDMocGF5b3V0cywgaSwgUEFZT1VUX0VOVFJZX0JZVEVTKSkKCWJ5dGVjIDQgLy8gICJwIgoJZnJhbWVfZGlnIDAgLy8gaTogdWludDY0CglpbnRjIDMgLy8gNDAKCS8KCWludGMgNSAvLyA0OAoJKgoJZnJhbWVfZGlnIC0xIC8vIHBheW91dHM6IGJ5dGVzCglmcmFtZV9kaWcgMCAvLyBpOiB1aW50NjQKCWludGMgMyAvLyA0MAoJZXh0cmFjdDMKCWJveF9yZXBsYWNlCgoqZm9yXzBfY29udGludWU6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjE4NgoJLy8gaSA9IGkgKyBQQVlPVVRfRU5UUllfQllURVMKCWZyYW1lX2RpZyAwIC8vIGk6IHVpbnQ2NAoJaW50YyAzIC8vIDQwCgkrCglmcmFtZV9idXJ5IDAgLy8gaTogdWludDY0CgliICpmb3JfMAoKKmZvcl8wX2VuZDoKCXJldHN1YgoKLy8gYWRkSXRlbXMocGF5LGJ5dGVbXSl2b2lkCiphYmlfcm91dGVfYWRkSXRlbXM6CgkvLyBhc3NldHM6IGJ5dGVbXQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCgkvLyBtYnJQYXk6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludGMgMSAvLyAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnRjIDEgLy8gIHBheQoJPT0KCgkvLyBhcmd1bWVudCAxIChtYnJQYXkpIGZvciBhZGRJdGVtcyBtdXN0IGJlIGEgcGF5IHRyYW5zYWN0aW9uCglhc3NlcnQKCgkvLyBleGVjdXRlIGFkZEl0ZW1zKHBheSxieXRlW10pdm9pZAoJY2FsbHN1YiBhZGRJdGVtcwoJaW50YyAxIC8vIDEKCXJldHVybgoKLy8gYWRkSXRlbXMobWJyUGF5OiBQYXlUeG4sIGFzc2V0czogYnl0ZXMpOiB2b2lkCi8vCi8vIEFwcGVuZCBhc3NldCBJRHMgdG8gdGhlIHNhbGUgbGlzdC4gVGhlIHBheW1lbnQgbXVzdCBjb3ZlciB0aGUgYm94IE1CUiBmb3IgYW55IG5ldyBwYWdlcy4KLy8gVGhlIGZyb250ZW5kIHNob3VsZCBvbmx5IHBhc3MgYXNzZXRzIHRoZSBkaXN0cmlidXRpb24gd2FsbGV0IGhvbGRzOyBhbnkgdGhhdCBhcmUgbm90Ci8vIGhlbGQgYXQgcmV2ZWFsIHRpbWUgYXJlIHNraXBwZWQgYW5kIGRyb3BwZWQgZnJvbSB0aGUgbGlzdC4KYWRkSXRlbXM6Cglwcm90byAyIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZWMgMCAvLyAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxOTgKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW4udmFsdWUgfHwgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLmRpc3RyaWJ1dGlvbi52YWx1ZSkKCXR4biBTZW5kZXIKCWJ5dGVjIDkgLy8gICJhZG1pbiIKCWFwcF9nbG9iYWxfZ2V0Cgk9PQoJZHVwCglibnogKnNraXBfb3IwCgl0eG4gU2VuZGVyCglieXRlYyA2IC8vICAiZGlzdHJpYnV0aW9uIgoJYXBwX2dsb2JhbF9nZXQKCT09Cgl8fAoKKnNraXBfb3IwOgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoxOTkKCS8vIGFzc2VydCh0aGlzLnN0YXR1cy52YWx1ZSA9PT0gU1RBVFVTX1NFVFVQKQoJYnl0ZWMgMiAvLyAgInN0YXR1cyIKCWFwcF9nbG9iYWxfZ2V0CglpbnRjIDAgLy8gMAoJPT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjAyCgkvLyBhc3NlcnQoYXNzZXRzLmxlbmd0aCAlIDggPT09IDApCglmcmFtZV9kaWcgLTIgLy8gYXNzZXRzOiBieXRlcwoJbGVuCglpbnRjIDIgLy8gOAoJJQoJaW50YyAwIC8vIDAKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjIwNAoJLy8gcHJlTWJyID0gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglwb3AKCWZyYW1lX2J1cnkgMCAvLyBwcmVNYnI6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjA2CgkvLyBjb25zdW1lZCA9IDAKCWludGMgMCAvLyAwCglmcmFtZV9idXJ5IDEgLy8gY29uc3VtZWQ6IHVpbnQ2NAoKKndoaWxlXzA6Cgoqd2hpbGVfMF9jb250aW51ZToKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjA3CgkvLyBjb25zdW1lZCA8IGFzc2V0cy5sZW5ndGgKCWZyYW1lX2RpZyAxIC8vIGNvbnN1bWVkOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBhc3NldHM6IGJ5dGVzCglsZW4KCTwKCWJ6ICp3aGlsZV8wX2VuZAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjA4CgkvLyBuID0gdGhpcy5yZW1haW5pbmcudmFsdWUKCWJ5dGVjIDMgLy8gICJyZW1haW5pbmciCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfYnVyeSAyIC8vIG46IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjA5CgkvLyBwYWdlID0gbiAvIFBBR0VfSVRFTVMKCWZyYW1lX2RpZyAyIC8vIG46IHVpbnQ2NAoJaW50YyA2IC8vIDEyOAoJLwoJZnJhbWVfYnVyeSAzIC8vIHBhZ2U6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjEwCgkvLyBvZmZzZXQgPSAobiAlIFBBR0VfSVRFTVMpICogOAoJZnJhbWVfZGlnIDIgLy8gbjogdWludDY0CglpbnRjIDYgLy8gMTI4CgklCglpbnRjIDIgLy8gOAoJKgoJZnJhbWVfYnVyeSA0IC8vIG9mZnNldDogdWludDY0CgoJLy8gKmlmMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjExCgkvLyBvZmZzZXQgPT09IDAKCWZyYW1lX2RpZyA0IC8vIG9mZnNldDogdWludDY0CglpbnRjIDAgLy8gMAoJPT0KCWJ6ICppZjBfZW5kCgoJLy8gKmlmMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjIxMgoJLy8gdGhpcy5pdGVtcyhwYWdlKS5jcmVhdGUoUEFHRV9CWVRFUykKCWJ5dGVjIDggLy8gICJpIgoJZnJhbWVfZGlnIDMgLy8gcGFnZTogdWludDY0CglpdG9iCgljb25jYXQKCWludGMgOSAvLyAxMDI0Cglib3hfY3JlYXRlCglwb3AKCippZjBfZW5kOgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoyMTQKCS8vIGNodW5rID0gUEFHRV9CWVRFUyAtIG9mZnNldAoJaW50YyA5IC8vIDEwMjQKCWZyYW1lX2RpZyA0IC8vIG9mZnNldDogdWludDY0CgktCglmcmFtZV9idXJ5IDUgLy8gY2h1bms6IHVpbnQ2NAoKCS8vICppZjFfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjIxNQoJLy8gY2h1bmsgPiBhc3NldHMubGVuZ3RoIC0gY29uc3VtZWQKCWZyYW1lX2RpZyA1IC8vIGNodW5rOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBhc3NldHM6IGJ5dGVzCglsZW4KCWZyYW1lX2RpZyAxIC8vIGNvbnN1bWVkOiB1aW50NjQKCS0KCT4KCWJ6ICppZjFfZW5kCgoJLy8gKmlmMV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjIxNgoJLy8gY2h1bmsgPSBhc3NldHMubGVuZ3RoIC0gY29uc3VtZWQKCWZyYW1lX2RpZyAtMiAvLyBhc3NldHM6IGJ5dGVzCglsZW4KCWZyYW1lX2RpZyAxIC8vIGNvbnN1bWVkOiB1aW50NjQKCS0KCWZyYW1lX2J1cnkgNSAvLyBjaHVuazogdWludDY0CgoqaWYxX2VuZDoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjE4CgkvLyB0aGlzLml0ZW1zKHBhZ2UpLnJlcGxhY2Uob2Zmc2V0LCBleHRyYWN0Myhhc3NldHMsIGNvbnN1bWVkLCBjaHVuaykpCglieXRlYyA4IC8vICAiaSIKCWZyYW1lX2RpZyAzIC8vIHBhZ2U6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgNCAvLyBvZmZzZXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0yIC8vIGFzc2V0czogYnl0ZXMKCWZyYW1lX2RpZyAxIC8vIGNvbnN1bWVkOiB1aW50NjQKCWZyYW1lX2RpZyA1IC8vIGNodW5rOiB1aW50NjQKCWV4dHJhY3QzCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjE5CgkvLyB0aGlzLnJlbWFpbmluZy52YWx1ZSA9IG4gKyBjaHVuayAvIDgKCWJ5dGVjIDMgLy8gICJyZW1haW5pbmciCglmcmFtZV9kaWcgMiAvLyBuOiB1aW50NjQKCWZyYW1lX2RpZyA1IC8vIGNodW5rOiB1aW50NjQKCWludGMgMiAvLyA4CgkvCgkrCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjIwCgkvLyBjb25zdW1lZCA9IGNvbnN1bWVkICsgY2h1bmsKCWZyYW1lX2RpZyAxIC8vIGNvbnN1bWVkOiB1aW50NjQKCWZyYW1lX2RpZyA1IC8vIGNodW5rOiB1aW50NjQKCSsKCWZyYW1lX2J1cnkgMSAvLyBjb25zdW1lZDogdWludDY0CgliICp3aGlsZV8wCgoqd2hpbGVfMF9lbmQ6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjIyMwoJLy8gdGhpcy50b3RhbC52YWx1ZSA9IHRoaXMucmVtYWluaW5nLnZhbHVlCglieXRlYyAxOCAvLyAgInRvdGFsIgoJYnl0ZWMgMyAvLyAgInJlbWFpbmluZyIKCWFwcF9nbG9iYWxfZ2V0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjI1CgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5LCB7CgkvLyAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgIGFtb3VudDogeyBncmVhdGVyVGhhbkVxdWFsVG86IHRoaXMuYXBwLmFkZHJlc3MubWluQmFsYW5jZSAtIHByZU1iciB9LAoJLy8gICAgIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXk6IFBheVR4bgoJZ3R4bnMgUmVjZWl2ZXIKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoibWJyUGF5IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyB2ZXJpZnkgYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMCAvLyBwcmVNYnI6IHVpbnQ2NAoJLQoJPj0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheSIsImZpZWxkIjoiYW1vdW50IiwiY29uZGl0aW9uIjoiZ3JlYXRlclRoYW5FcXVhbFRvIiwiZXhwZWN0ZWQiOiI+PXRoaXMuYXBwLmFkZHJlc3MubWluQmFsYW5jZSAtIHByZU1iciJ9Cglhc3NlcnQKCXJldHN1YgoKLy8gcmVnaXN0ZXIoKXZvaWQKKmFiaV9yb3V0ZV9yZWdpc3RlcjoKCS8vIGV4ZWN1dGUgcmVnaXN0ZXIoKXZvaWQKCWNhbGxzdWIgcmVnaXN0ZXIKCWludGMgMSAvLyAxCglyZXR1cm4KCi8vIHJlZ2lzdGVyKCk6IHZvaWQKLy8KLy8gR28gbGl2ZS4gTXVzdCBiZSBmb2xsb3dlZCBpbiB0aGUgc2FtZSBncm91cCBieSB0aGUgZGlzdHJpYnV0aW9uIHdhbGxldCdzIHJla2V5IHRvIHRoaXMKLy8gYXBwLCBvciBjYWxsZWQgYWZ0ZXIgdGhhdCByZWtleSBoYXMgaGFwcGVuZWQuIEVpdGhlciB3YXkgdGhlIGRpc3RyaWJ1dGlvbiB3YWxsZXQgY2FuCi8vIHNpZ24gYm90aCB0cmFuc2FjdGlvbnMgaW4gb25lIHByb21wdDogW3JlZ2lzdGVyKCksIHBheSAwIHRvIHNlbGYgd2l0aCByZWtleVRvPWFwcF0uCnJlZ2lzdGVyOgoJcHJvdG8gMCAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGVjIDAgLy8gMHgKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjIzNwoJLy8gYXNzZXJ0KHRoaXMuc3RhdHVzLnZhbHVlID09PSBTVEFUVVNfU0VUVVApCglieXRlYyAyIC8vICAic3RhdHVzIgoJYXBwX2dsb2JhbF9nZXQKCWludGMgMCAvLyAwCgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoyMzgKCS8vIGFzc2VydCh0aGlzLnJlbWFpbmluZy52YWx1ZSA+IDApCglieXRlYyAzIC8vICAicmVtYWluaW5nIgoJYXBwX2dsb2JhbF9nZXQKCWludGMgMCAvLyAwCgk+Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjI0MAoJLy8gZGlzdCA9IHRoaXMuZGlzdHJpYnV0aW9uLnZhbHVlCglieXRlYyA2IC8vICAiZGlzdHJpYnV0aW9uIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2J1cnkgMCAvLyBkaXN0OiBhZGRyZXNzCgoJLy8gKmlmMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjQxCgkvLyBkaXN0LmF1dGhBZGRyICE9PSB0aGlzLmFwcC5hZGRyZXNzCglmcmFtZV9kaWcgMCAvLyBkaXN0OiBhZGRyZXNzCglhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCglwb3AKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCgkhPQoJYnogKmlmMl9lbmQKCgkvLyAqaWYyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjQyCgkvLyB2ZXJpZnlQYXlUeG4odGhpcy50eG5Hcm91cFt0aGlzLnR4bi5ncm91cEluZGV4ICsgMV0sIHsKCS8vICAgICAgICAgc2VuZGVyOiBkaXN0LAoJLy8gICAgICAgICByZWNlaXZlcjogZGlzdCwKCS8vICAgICAgICAgYW1vdW50OiAwLAoJLy8gICAgICAgICBjbG9zZVJlbWFpbmRlclRvOiBnbG9iYWxzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICByZWtleVRvOiB0aGlzLmFwcC5hZGRyZXNzLAoJLy8gICAgICAgfSkKCXR4biBHcm91cEluZGV4CglpbnRjIDEgLy8gMQoJKwoJc3RvcmUgMjQ4IC8vIHZlcmlmeVR4biBpbmRleAoKCS8vIHZlcmlmeSBwYXkKCWxvYWQgMjQ4IC8vIHZlcmlmeVR4biBpbmRleAoJZ3R4bnMgVHlwZUVudW0KCWludGMgMSAvLyAgcGF5Cgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoidGhpcy50eG5Hcm91cFt0aGlzLnR4bi5ncm91cEluZGV4ICsgMV0iLCJmaWVsZCI6InR5cGVFbnVtIiwiZXhwZWN0ZWQiOiJwYXkifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHNlbmRlcgoJbG9hZCAyNDggLy8gdmVyaWZ5VHhuIGluZGV4CglndHhucyBTZW5kZXIKCWZyYW1lX2RpZyAwIC8vIGRpc3Q6IGFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJ0aGlzLnR4bkdyb3VwW3RoaXMudHhuLmdyb3VwSW5kZXggKyAxXSIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJkaXN0In0KCWFzc2VydAoKCS8vIHZlcmlmeSByZWNlaXZlcgoJbG9hZCAyNDggLy8gdmVyaWZ5VHhuIGluZGV4CglndHhucyBSZWNlaXZlcgoJZnJhbWVfZGlnIDAgLy8gZGlzdDogYWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InRoaXMudHhuR3JvdXBbdGhpcy50eG4uZ3JvdXBJbmRleCArIDFdIiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoiZGlzdCJ9Cglhc3NlcnQKCgkvLyB2ZXJpZnkgYW1vdW50Cglsb2FkIDI0OCAvLyB2ZXJpZnlUeG4gaW5kZXgKCWd0eG5zIEFtb3VudAoJaW50YyAwIC8vIDAKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJ0aGlzLnR4bkdyb3VwW3RoaXMudHhuLmdyb3VwSW5kZXggKyAxXSIsImZpZWxkIjoiYW1vdW50IiwiZXhwZWN0ZWQiOiIwIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBjbG9zZVJlbWFpbmRlclRvCglsb2FkIDI0OCAvLyB2ZXJpZnlUeG4gaW5kZXgKCWd0eG5zIENsb3NlUmVtYWluZGVyVG8KCWdsb2JhbCBaZXJvQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InRoaXMudHhuR3JvdXBbdGhpcy50eG4uZ3JvdXBJbmRleCArIDFdIiwiZmllbGQiOiJjbG9zZVJlbWFpbmRlclRvIiwiZXhwZWN0ZWQiOiJnbG9iYWxzLnplcm9BZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSByZWtleVRvCglsb2FkIDI0OCAvLyB2ZXJpZnlUeG4gaW5kZXgKCWd0eG5zIFJla2V5VG8KCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoidGhpcy50eG5Hcm91cFt0aGlzLnR4bi5ncm91cEluZGV4ICsgMV0iLCJmaWVsZCI6InJla2V5VG8iLCJleHBlY3RlZCI6InRoaXMuYXBwLmFkZHJlc3MifQoJYXNzZXJ0CgoqaWYyX2VuZDoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjUxCgkvLyB0aGlzLnN0YXR1cy52YWx1ZSA9IFNUQVRVU19MSVZFCglieXRlYyAyIC8vICAic3RhdHVzIgoJaW50YyAxIC8vIDEKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoyNTIKCS8vIHRoaXMuc3luY0ZhY3RvcnkoKQoJY2FsbHN1YiBzeW5jRmFjdG9yeQoJcmV0c3ViCgovLyBwYXVzZSgpdm9pZAoqYWJpX3JvdXRlX3BhdXNlOgoJLy8gZXhlY3V0ZSBwYXVzZSgpdm9pZAoJY2FsbHN1YiBwYXVzZQoJaW50YyAxIC8vIDEKCXJldHVybgoKLy8gcGF1c2UoKTogdm9pZApwYXVzZToKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjU2CgkvLyBhc3NlcnQodGhpcy50eG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlKQoJdHhuIFNlbmRlcgoJYnl0ZWMgOSAvLyAgImFkbWluIgoJYXBwX2dsb2JhbF9nZXQKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjI1NwoJLy8gYXNzZXJ0KHRoaXMuc3RhdHVzLnZhbHVlID09PSBTVEFUVVNfTElWRSkKCWJ5dGVjIDIgLy8gICJzdGF0dXMiCglhcHBfZ2xvYmFsX2dldAoJaW50YyAxIC8vIDEKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjI1OAoJLy8gdGhpcy5zdGF0dXMudmFsdWUgPSBTVEFUVVNfUEFVU0VECglieXRlYyAyIC8vICAic3RhdHVzIgoJaW50YyAxMSAvLyAyCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjU5CgkvLyB0aGlzLnN5bmNGYWN0b3J5KCkKCWNhbGxzdWIgc3luY0ZhY3RvcnkKCXJldHN1YgoKLy8gdW5wYXVzZSgpdm9pZAoqYWJpX3JvdXRlX3VucGF1c2U6CgkvLyBleGVjdXRlIHVucGF1c2UoKXZvaWQKCWNhbGxzdWIgdW5wYXVzZQoJaW50YyAxIC8vIDEKCXJldHVybgoKLy8gdW5wYXVzZSgpOiB2b2lkCnVucGF1c2U6Cglwcm90byAwIDAKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjI2MwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSkKCXR4biBTZW5kZXIKCWJ5dGVjIDkgLy8gICJhZG1pbiIKCWFwcF9nbG9iYWxfZ2V0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoyNjQKCS8vIGFzc2VydCh0aGlzLnN0YXR1cy52YWx1ZSA9PT0gU1RBVFVTX1BBVVNFRCkKCWJ5dGVjIDIgLy8gICJzdGF0dXMiCglhcHBfZ2xvYmFsX2dldAoJaW50YyAxMSAvLyAyCgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoyNjUKCS8vIHRoaXMuc3RhdHVzLnZhbHVlID0gU1RBVFVTX0xJVkUKCWJ5dGVjIDIgLy8gICJzdGF0dXMiCglpbnRjIDEgLy8gMQoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjI2NgoJLy8gdGhpcy5zeW5jRmFjdG9yeSgpCgljYWxsc3ViIHN5bmNGYWN0b3J5CglyZXRzdWIKCi8vIHNldFByaWNlKHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc2V0UHJpY2U6CgkvLyBwcmljZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBzZXRQcmljZSh1aW50NjQpdm9pZAoJY2FsbHN1YiBzZXRQcmljZQoJaW50YyAxIC8vIDEKCXJldHVybgoKLy8gc2V0UHJpY2UocHJpY2U6IHVpbnQ2NCk6IHZvaWQKc2V0UHJpY2U6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjI3MAoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSkKCXR4biBTZW5kZXIKCWJ5dGVjIDkgLy8gICJhZG1pbiIKCWFwcF9nbG9iYWxfZ2V0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoyNzEKCS8vIGFzc2VydCh0aGlzLnN0YXR1cy52YWx1ZSAhPT0gU1RBVFVTX1JFTEVBU0VEKQoJYnl0ZWMgMiAvLyAgInN0YXR1cyIKCWFwcF9nbG9iYWxfZ2V0CglpbnRjIDcgLy8gMwoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjcyCgkvLyB0aGlzLnByaWNlLnZhbHVlID0gcHJpY2UKCWJ5dGVjIDEzIC8vICAicHJpY2UiCglmcmFtZV9kaWcgLTEgLy8gcHJpY2U6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjI3MwoJLy8gdGhpcy5zeW5jRmFjdG9yeSgpCgljYWxsc3ViIHN5bmNGYWN0b3J5CglyZXRzdWIKCi8vIHNldEVuZFJvdW5kKHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc2V0RW5kUm91bmQ6CgkvLyBlbmRSb3VuZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBzZXRFbmRSb3VuZCh1aW50NjQpdm9pZAoJY2FsbHN1YiBzZXRFbmRSb3VuZAoJaW50YyAxIC8vIDEKCXJldHVybgoKLy8gc2V0RW5kUm91bmQoZW5kUm91bmQ6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gVGhlIGVuZCByb3VuZCBjYW4gYmUgbW92ZWQgYnV0IG5ldmVyIHJlbW92ZWQsIHNvIHRoZSBwZXJtaXNzaW9ubGVzcyByZWxlYXNlIGFsd2F5cyBhcHBsaWVzIGV2ZW50dWFsbHkuCnNldEVuZFJvdW5kOgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czoyNzgKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW4udmFsdWUpCgl0eG4gU2VuZGVyCglieXRlYyA5IC8vICAiYWRtaW4iCglhcHBfZ2xvYmFsX2dldAoJPT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6Mjc5CgkvLyBhc3NlcnQodGhpcy5zdGF0dXMudmFsdWUgIT09IFNUQVRVU19SRUxFQVNFRCkKCWJ5dGVjIDIgLy8gICJzdGF0dXMiCglhcHBfZ2xvYmFsX2dldAoJaW50YyA3IC8vIDMKCSE9Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjI4MAoJLy8gYXNzZXJ0KGVuZFJvdW5kID4gZ2xvYmFscy5yb3VuZCkKCWZyYW1lX2RpZyAtMSAvLyBlbmRSb3VuZDogdWludDY0CglnbG9iYWwgUm91bmQKCT4KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjgxCgkvLyBhc3NlcnQoZW5kUm91bmQgPiB0aGlzLnN0YXJ0Um91bmQudmFsdWUpCglmcmFtZV9kaWcgLTEgLy8gZW5kUm91bmQ6IHVpbnQ2NAoJYnl0ZWMgMTcgLy8gICJzdGFydCIKCWFwcF9nbG9iYWxfZ2V0Cgk+Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjI4MgoJLy8gdGhpcy5lbmRSb3VuZC52YWx1ZSA9IGVuZFJvdW5kCglieXRlYyAxMiAvLyAgImVuZCIKCWZyYW1lX2RpZyAtMSAvLyBlbmRSb3VuZDogdWludDY0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MjgzCgkvLyB0aGlzLnN5bmNGYWN0b3J5KCkKCWNhbGxzdWIgc3luY0ZhY3RvcnkKCXJldHN1YgoKLy8gY29tbWl0KHBheSx1aW50NjQpdWludDY0CiphYmlfcm91dGVfY29tbWl0OgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlYyAyMiAvLyAweDE1MWY3Yzc1CgoJLy8gbWF4UHJpY2U6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIHBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludGMgMSAvLyAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnRjIDEgLy8gIHBheQoJPT0KCgkvLyBhcmd1bWVudCAxIChwYXltZW50KSBmb3IgY29tbWl0IG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgY29tbWl0KHBheSx1aW50NjQpdWludDY0CgljYWxsc3ViIGNvbW1pdAoJaXRvYgoJY29uY2F0Cglsb2cKCWludGMgMSAvLyAxCglyZXR1cm4KCi8vIGNvbW1pdChwYXltZW50OiBQYXlUeG4sIG1heFByaWNlOiB1aW50NjQpOiB1aW50NjQKLy8KLy8gUmVzZXJ2ZSBvbmUgcmFuZG9tIGl0ZW0uIFBheW1lbnQgbXVzdCBjb3ZlciB0aGUgZm91ciBsaW5lIGl0ZW1zOgovLyBwcmljZSAgICAgICAgICAtPiBjcmVhdG9yIChoZWxkIHVudGlsIHJldmVhbCkKLy8gcmV2ZWFsRmVlICAgICAgLT4gd2hvZXZlciBjYWxscyByZXZlYWwgKGtlZXBlciBib3VudHkpCi8vIGNvbW1pdCBib3ggTUJSIC0+IHJlZnVuZGFibGUgKDI1MDAgKyA0MDAgKiAoOS1ieXRlIGtleSArIDcyLWJ5dGUgQ29tbWl0KSA9IDM0LDkwMCB0b2RheSkKLy8gZGVsaXZlcnlCdWRnZXQgLT4gcmVmdW5kYWJsZSBkZWxpdmVyeSBkZXBvc2l0IChkaXJlY3QgcmVmdW5kIG9yIGNhcnJpZWQgdG8gdGhlIEFSQy01OSBpbmJveCkKLy8gQW55dGhpbmcgcGFpZCBhYm92ZSB0aGF0IGlzIGFkZGVkIHRvIHRoZSByZWZ1bmRhYmxlIGRlcG9zaXQuIGBtYXhQcmljZWAgaXMgdGhlIHByaWNlIHRoZQovLyBidXllciBzYXcsIHNvIGEgcHJpY2UgcmFpc2VkIHdoaWxlIHRoZSBjb21taXQgaXMgaW4gZmxpZ2h0IG1ha2VzIGl0IGZhaWwgaW5zdGVhZCBvZiBjaGFyZ2luZyBtb3JlLgpjb21taXQ6Cglwcm90byAyIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZWMgMCAvLyAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozMDAKCS8vIGFzc2VydCh0aGlzLnN0YXR1cy52YWx1ZSA9PT0gU1RBVFVTX0xJVkUpCglieXRlYyAyIC8vICAic3RhdHVzIgoJYXBwX2dsb2JhbF9nZXQKCWludGMgMSAvLyAxCgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozMDEKCS8vIGFzc2VydChnbG9iYWxzLnJvdW5kID49IHRoaXMuc3RhcnRSb3VuZC52YWx1ZSkKCWdsb2JhbCBSb3VuZAoJYnl0ZWMgMTcgLy8gICJzdGFydCIKCWFwcF9nbG9iYWxfZ2V0Cgk+PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozMDIKCS8vIGFzc2VydChnbG9iYWxzLnJvdW5kIDw9IHRoaXMuZW5kUm91bmQudmFsdWUpCglnbG9iYWwgUm91bmQKCWJ5dGVjIDEyIC8vICAiZW5kIgoJYXBwX2dsb2JhbF9nZXQKCTw9Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjMwMwoJLy8gYXNzZXJ0KHRoaXMucGVuZGluZy52YWx1ZSA8IHRoaXMucmVtYWluaW5nLnZhbHVlKQoJYnl0ZWMgNSAvLyAgInBlbmRpbmciCglhcHBfZ2xvYmFsX2dldAoJYnl0ZWMgMyAvLyAgInJlbWFpbmluZyIKCWFwcF9nbG9iYWxfZ2V0Cgk8Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjMwNQoJLy8gY29tbWl0SWQgPSB0aGlzLm5leHRDb21taXQudmFsdWUKCWJ5dGVjIDE0IC8vICAibmV4dF9jb21taXQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfYnVyeSAwIC8vIGNvbW1pdElkOiB1aW50NjQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjMwOAoJLy8gcHJlTWJyID0gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglwb3AKCWZyYW1lX2J1cnkgMSAvLyBwcmVNYnI6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MzA5CgkvLyB0aGlzLmNvbW1pdHMoY29tbWl0SWQpLmNyZWF0ZSgpCglieXRlYyAxIC8vICAiYyIKCWZyYW1lX2RpZyAwIC8vIGNvbW1pdElkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJcHVzaGludCA3MgoJYm94X2NyZWF0ZQoJcG9wCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozMTAKCS8vIGJveE1iciA9IHRoaXMuYXBwLmFkZHJlc3MubWluQmFsYW5jZSAtIHByZU1icgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMSAvLyBwcmVNYnI6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAyIC8vIGJveE1icjogdWludDY0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozMTIKCS8vIHByaWNlID0gdGhpcy5wcmljZS52YWx1ZQoJYnl0ZWMgMTMgLy8gICJwcmljZSIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9idXJ5IDMgLy8gcHJpY2U6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MzEzCgkvLyBhc3NlcnQocHJpY2UgPD0gbWF4UHJpY2UpCglmcmFtZV9kaWcgMyAvLyBwcmljZTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gbWF4UHJpY2U6IHVpbnQ2NAoJPD0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MzE0CgkvLyByZXZlYWxGZWUgPSB0aGlzLnJldmVhbEZlZS52YWx1ZQoJYnl0ZWMgMjAgLy8gICJyZXZlYWxfZmVlIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2J1cnkgNCAvLyByZXZlYWxGZWU6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MzE1CgkvLyB2ZXJpZnlQYXlUeG4ocGF5bWVudCwgewoJLy8gICAgICAgc2VuZGVyOiB0aGlzLnR4bi5zZW5kZXIsCgkvLyAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgIGNsb3NlUmVtYWluZGVyVG86IGdsb2JhbHMuemVyb0FkZHJlc3MsCgkvLyAgICAgICByZWtleVRvOiBnbG9iYWxzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgYW1vdW50OiB7IGdyZWF0ZXJUaGFuRXF1YWxUbzogcHJpY2UgKyByZXZlYWxGZWUgKyBib3hNYnIgKyB0aGlzLmRlbGl2ZXJ5QnVkZ2V0LnZhbHVlIH0sCgkvLyAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBwYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJdHhuIFNlbmRlcgoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InBheW1lbnQiLCJmaWVsZCI6InNlbmRlciIsImV4cGVjdGVkIjoidGhpcy50eG4uc2VuZGVyIn0KCWFzc2VydAoKCS8vIHZlcmlmeSByZWNlaXZlcgoJZnJhbWVfZGlnIC0xIC8vIHBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgUmVjZWl2ZXIKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoicGF5bWVudCIsImZpZWxkIjoicmVjZWl2ZXIiLCJleHBlY3RlZCI6InRoaXMuYXBwLmFkZHJlc3MifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IGNsb3NlUmVtYWluZGVyVG8KCWZyYW1lX2RpZyAtMSAvLyBwYXltZW50OiBQYXlUeG4KCWd0eG5zIENsb3NlUmVtYWluZGVyVG8KCWdsb2JhbCBaZXJvQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InBheW1lbnQiLCJmaWVsZCI6ImNsb3NlUmVtYWluZGVyVG8iLCJleHBlY3RlZCI6Imdsb2JhbHMuemVyb0FkZHJlc3MifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHJla2V5VG8KCWZyYW1lX2RpZyAtMSAvLyBwYXltZW50OiBQYXlUeG4KCWd0eG5zIFJla2V5VG8KCWdsb2JhbCBaZXJvQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6InBheW1lbnQiLCJmaWVsZCI6InJla2V5VG8iLCJleHBlY3RlZCI6Imdsb2JhbHMuemVyb0FkZHJlc3MifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IGFtb3VudAoJZnJhbWVfZGlnIC0xIC8vIHBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgMyAvLyBwcmljZTogdWludDY0CglmcmFtZV9kaWcgNCAvLyByZXZlYWxGZWU6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gYm94TWJyOiB1aW50NjQKCSsKCWJ5dGVjIDE5IC8vICAiZGVsaXZlcnlfYnVkZ2V0IgoJYXBwX2dsb2JhbF9nZXQKCSsKCT49CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJwYXltZW50IiwiZmllbGQiOiJhbW91bnQiLCJjb25kaXRpb24iOiJncmVhdGVyVGhhbkVxdWFsVG8iLCJleHBlY3RlZCI6Ij49cHJpY2UgKyByZXZlYWxGZWUgKyBib3hNYnIgKyB0aGlzLmRlbGl2ZXJ5QnVkZ2V0LnZhbHVlIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MzIzCgkvLyB0YXJnZXRSb3VuZCA9IGdsb2JhbHMucm91bmQgKyBSRVZFQUxfREVMQVkKCWdsb2JhbCBSb3VuZAoJaW50YyAxIC8vIDEKCSsKCWZyYW1lX2J1cnkgNSAvLyB0YXJnZXRSb3VuZDogdWludDY0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozMjQKCS8vIHRoaXMuY29tbWl0cyhjb21taXRJZCkudmFsdWUgPSB7CgkvLyAgICAgICBidXllcjogdGhpcy50eG4uc2VuZGVyLAoJLy8gICAgICAgdGFyZ2V0Um91bmQ6IHRhcmdldFJvdW5kLAoJLy8gICAgICAgcHJpY2U6IHByaWNlLAoJLy8gICAgICAgcmV2ZWFsRmVlOiByZXZlYWxGZWUsCgkvLyAgICAgICBkZXBvc2l0OiBwYXltZW50LmFtb3VudCAtIHByaWNlIC0gcmV2ZWFsRmVlIC0gYm94TWJyLAoJLy8gICAgICAgYm94TWJyOiBib3hNYnIsCgkvLyAgICAgfQoJYnl0ZWMgMSAvLyAgImMiCglmcmFtZV9kaWcgMCAvLyBjb21taXRJZDogdWludDY0CglpdG9iCgljb25jYXQKCXR4biBTZW5kZXIKCWZyYW1lX2RpZyA1IC8vIHRhcmdldFJvdW5kOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIDMgLy8gcHJpY2U6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgNCAvLyByZXZlYWxGZWU6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTEgLy8gcGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAzIC8vIHByaWNlOiB1aW50NjQKCS0KCWZyYW1lX2RpZyA0IC8vIHJldmVhbEZlZTogdWludDY0CgktCglmcmFtZV9kaWcgMiAvLyBib3hNYnI6IHVpbnQ2NAoJLQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMiAvLyBib3hNYnI6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cglib3hfcHV0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozMzMKCS8vIHRoaXMubmV4dENvbW1pdC52YWx1ZSA9IGNvbW1pdElkICsgMQoJYnl0ZWMgMTQgLy8gICJuZXh0X2NvbW1pdCIKCWZyYW1lX2RpZyAwIC8vIGNvbW1pdElkOiB1aW50NjQKCWludGMgMSAvLyAxCgkrCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MzM0CgkvLyB0aGlzLnBlbmRpbmcudmFsdWUgPSB0aGlzLnBlbmRpbmcudmFsdWUgKyAxCglieXRlYyA1IC8vICAicGVuZGluZyIKCWR1cAoJYXBwX2dsb2JhbF9nZXQKCWludGMgMSAvLyAxCgkrCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MzM2CgkvLyB0aGlzLkNvbW1pdHRlZC5sb2coeyBjb21taXRJZDogY29tbWl0SWQsIGJ1eWVyOiB0aGlzLnR4bi5zZW5kZXIsIHRhcmdldFJvdW5kOiB0YXJnZXRSb3VuZCB9KQoJcHVzaGJ5dGVzIDB4NzhmODQyNjYgLy8gQ29tbWl0dGVkKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkKCWZyYW1lX2RpZyAwIC8vIGNvbW1pdElkOiB1aW50NjQKCWl0b2IKCXR4biBTZW5kZXIKCWNvbmNhdAoJZnJhbWVfZGlnIDUgLy8gdGFyZ2V0Um91bmQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MzM3CgkvLyByZXR1cm4gY29tbWl0SWQ7CglmcmFtZV9kaWcgMCAvLyBjb21taXRJZDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gNQoJcmV0c3ViCgovLyByZXZlYWwodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9yZXZlYWw6CgkvLyBjb21taXRJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSByZXZlYWwodWludDY0KXZvaWQKCWNhbGxzdWIgcmV2ZWFsCglpbnRjIDEgLy8gMQoJcmV0dXJuCgovLyByZXZlYWwoY29tbWl0SWQ6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gUmVzb2x2ZSBhIGNvbW1pdCBvbmNlIGl0cyB0YXJnZXQgcm91bmQgaGFzIHBhc3NlZC4gQ2FsbGFibGUgYnkgYW55b25lLCBidXQgb25seSBmb3IgdGhlCi8vIGNvbW1pdCBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgKGBuZXh0X3JldmVhbGApLCBzbyBldmVyeSByZXN1bHQgaXMgZml4ZWQgYnkgdGhlIGJsb2NrIHNlZWRzCi8vIGFsb25lLCBuZXZlciBieSB3aG8gcmV2ZWFscyBmaXJzdC4gVGhlIGNhbGxlciByZWNlaXZlcyByZXZlYWxGZWUgYXMgYSBib3VudHksIHdoaWNoIHNob3VsZAovLyBleGNlZWQgdGhlIHBvb2xlZCBmZWVzIHRoZXkgcGF5IGZvciB0aGlzIGNhbGwuCi8vCi8vIFNlY3VyaXR5IGludmFyaWFudDogb25jZSBhIGRyYXcgaXMgbWFkZSwgbm90aGluZyB0aGUgYnV5ZXIgY29udHJvbHMgY2FuIG1ha2UgdGhpcyBjYWxsCi8vIGZhaWwuIE90aGVyd2lzZSBhIGJ1eWVyIGNvdWxkIGxldCB1bndhbnRlZCBkcmF3cyBleHBpcmUgYW5kIHRha2UgdGhlIHJlZnVuZCAoZnJlZSByZS1yb2xsKS4KLy8gU28gZXZlcnkgcGF5bWVudCB0byB0aGUgYnV5ZXIgZ29lcyBlaXRoZXIgdG8gYW4gYWNjb3VudCB0aGF0IHByb3ZhYmx5IGV4aXN0cyAob3B0ZWQgaW4KLy8gdG8gdGhlIGFzc2V0KSBvciBpbnRvIHRoZSBBUkMtNTkgaW5ib3gsIGFuZCB0aGUgZGVwb3NpdCBmbG9vciBjb3ZlcnMgdGhlIHdvcnN0LWNhc2UgaW5ib3guCnJldmVhbDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlYyAwIC8vIDB4CglkdXBuIDExCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozNTIKCS8vIGFzc2VydChjb21taXRJZCA9PT0gdGhpcy5uZXh0UmV2ZWFsLnZhbHVlKQoJZnJhbWVfZGlnIC0xIC8vIGNvbW1pdElkOiB1aW50NjQKCWJ5dGVjIDExIC8vICAibmV4dF9yZXZlYWwiCglhcHBfZ2xvYmFsX2dldAoJPT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MzUzCgkvLyBhc3NlcnQodGhpcy5jb21taXRzKGNvbW1pdElkKS5leGlzdHMpCglieXRlYyAxIC8vICAiYyIKCWZyYW1lX2RpZyAtMSAvLyBjb21taXRJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozNTYKCS8vIGJ1eWVyID0gdGhpcy5jb21taXRzKGNvbW1pdElkKS52YWx1ZS5idXllcgoJaW50YyAwIC8vIDAKCWludGMgNCAvLyAzMgoJYnl0ZWMgMSAvLyAgImMiCglmcmFtZV9kaWcgLTEgLy8gY29tbWl0SWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIGJ1eWVyOiBhZGRyZXNzCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozNTcKCS8vIHRhcmdldFJvdW5kID0gdGhpcy5jb21taXRzKGNvbW1pdElkKS52YWx1ZS50YXJnZXRSb3VuZAoJaW50YyA0IC8vICBoZWFkT2Zmc2V0CglpbnRjIDIgLy8gOAoJYnl0ZWMgMSAvLyAgImMiCglmcmFtZV9kaWcgLTEgLy8gY29tbWl0SWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAxIC8vIHRhcmdldFJvdW5kOiB1aW50NjQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjM1OAoJLy8gcHJpY2UgPSB0aGlzLmNvbW1pdHMoY29tbWl0SWQpLnZhbHVlLnByaWNlCglpbnRjIDMgLy8gIGhlYWRPZmZzZXQKCWludGMgMiAvLyA4CglieXRlYyAxIC8vICAiYyIKCWZyYW1lX2RpZyAtMSAvLyBjb21taXRJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDIgLy8gcHJpY2U6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MzU5CgkvLyByZXZlYWxGZWUgPSB0aGlzLmNvbW1pdHMoY29tbWl0SWQpLnZhbHVlLnJldmVhbEZlZQoJaW50YyA1IC8vICBoZWFkT2Zmc2V0CglpbnRjIDIgLy8gOAoJYnl0ZWMgMSAvLyAgImMiCglmcmFtZV9kaWcgLTEgLy8gY29tbWl0SWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIHJldmVhbEZlZTogdWludDY0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozNjAKCS8vIHJlZnVuZGFibGUgPSB0aGlzLmNvbW1pdHMoY29tbWl0SWQpLnZhbHVlLmRlcG9zaXQgKyB0aGlzLmNvbW1pdHMoY29tbWl0SWQpLnZhbHVlLmJveE1icgoJaW50YyAxMyAvLyAgaGVhZE9mZnNldAoJaW50YyAyIC8vIDgKCWJ5dGVjIDEgLy8gICJjIgoJZnJhbWVfZGlnIC0xIC8vIGNvbW1pdElkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludGMgMTQgLy8gIGhlYWRPZmZzZXQKCWludGMgMiAvLyA4CglieXRlYyAxIC8vICAiYyIKCWZyYW1lX2RpZyAtMSAvLyBjb21taXRJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgkrCglmcmFtZV9idXJ5IDQgLy8gcmVmdW5kYWJsZTogdWludDY0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozNjIKCS8vIGVudHJvcHkgPSBzaGEyNTYoCgkvLyAgICAgICBjb25jYXQoY29uY2F0KGJsb2Nrc1t0YXJnZXRSb3VuZF0uc2VlZCwgYnV5ZXIpLCBjb25jYXQoaXRvYihjb21taXRJZCksIGl0b2IoZ2xvYmFscy5jdXJyZW50QXBwbGljYXRpb25JRCkpKQoJLy8gICAgICkKCWZyYW1lX2RpZyAxIC8vIHRhcmdldFJvdW5kOiB1aW50NjQKCWJsb2NrIEJsa1NlZWQKCWZyYW1lX2RpZyAwIC8vIGJ1eWVyOiBhZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBjb21taXRJZDogdWludDY0CglpdG9iCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKCWl0b2IKCWNvbmNhdAoJY29uY2F0CglzaGEyNTYKCWZyYW1lX2J1cnkgNSAvLyBlbnRyb3B5OiBieXRlWzMyXQoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MzcwCgkvLyBhc3NldElkID0gMAoJaW50YyAwIC8vIDAKCWZyYW1lX2J1cnkgNiAvLyBhc3NldElkOiB1aW50NjQKCip3aGlsZV8xOgoKKndoaWxlXzFfY29udGludWU6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjM3MQoJLy8gYXNzZXRJZCA9PT0gMCAmJiB0aGlzLnJlbWFpbmluZy52YWx1ZSA+IDAKCWZyYW1lX2RpZyA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJaW50YyAwIC8vIDAKCT09CglkdXAKCWJ6ICpza2lwX2FuZDAKCWJ5dGVjIDMgLy8gICJyZW1haW5pbmciCglhcHBfZ2xvYmFsX2dldAoJaW50YyAwIC8vIDAKCT4KCSYmCgoqc2tpcF9hbmQwOgoJYnogKndoaWxlXzFfZW5kCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozNzIKCS8vIGNhbmRpZGF0ZSA9IHRoaXMudGFrZUl0ZW0oZXh0cmFjdFVpbnQ2NChlbnRyb3B5LCAwKSAlIHRoaXMucmVtYWluaW5nLnZhbHVlKQoJZnJhbWVfZGlnIDUgLy8gZW50cm9weTogYnl0ZVszMl0KCWludGMgMCAvLyAwCglleHRyYWN0X3VpbnQ2NAoJYnl0ZWMgMyAvLyAgInJlbWFpbmluZyIKCWFwcF9nbG9iYWxfZ2V0CgklCgljYWxsc3ViIHRha2VJdGVtCglmcmFtZV9idXJ5IDcgLy8gY2FuZGlkYXRlOiB1aW50NjQKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozNzQKCS8vIGNhbmRpZGF0ZSAhPT0gMAoJZnJhbWVfZGlnIDcgLy8gY2FuZGlkYXRlOiB1aW50NjQKCWludGMgMCAvLyAwCgkhPQoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6Mzc1CgkvLyBhc3NldCA9IEFzc2V0SUQuZnJvbVVpbnQ2NChjYW5kaWRhdGUpCglmcmFtZV9kaWcgNyAvLyBjYW5kaWRhdGU6IHVpbnQ2NAoJZnJhbWVfYnVyeSA4IC8vIGFzc2V0OiB1aW50NjQKCgkvLyAqaWY0X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozNzYKCS8vIHRoaXMuZGlzdHJpYnV0aW9uLnZhbHVlLmlzT3B0ZWRJblRvQXNzZXQoYXNzZXQpCglieXRlYyA2IC8vICAiZGlzdHJpYnV0aW9uIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyA4IC8vIGFzc2V0OiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJc3dhcAoJcG9wCglieiAqaWY0X2VuZAoKCS8vICppZjRfY29uc2VxdWVudAoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6Mzc3CgkvLyB0aGlzLmRpc3RyaWJ1dGlvbi52YWx1ZS5hc3NldEJhbGFuY2UoYXNzZXQpID4gMCAmJiAhYXNzZXQuZGVmYXVsdEZyb3plbgoJYnl0ZWMgNiAvLyAgImRpc3RyaWJ1dGlvbiIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgOCAvLyBhc3NldDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJaW50YyAwIC8vIDAKCT4KCWR1cAoJYnogKnNraXBfYW5kMQoJZnJhbWVfZGlnIDggLy8gYXNzZXQ6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KCXBvcAoJIQoJJiYKCipza2lwX2FuZDE6CglieiAqaWY1X2VuZAoKCS8vICppZjVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozNzgKCS8vIGFzc2V0SWQgPSBjYW5kaWRhdGUKCWZyYW1lX2RpZyA3IC8vIGNhbmRpZGF0ZTogdWludDY0CglmcmFtZV9idXJ5IDYgLy8gYXNzZXRJZDogdWludDY0CgoqaWY1X2VuZDoKCippZjRfZW5kOgoKKmlmM19lbmQ6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjM4MgoJLy8gZW50cm9weSA9IHNoYTI1NihlbnRyb3B5KQoJZnJhbWVfZGlnIDUgLy8gZW50cm9weTogYnl0ZVszMl0KCXNoYTI1NgoJZnJhbWVfYnVyeSA1IC8vIGVudHJvcHk6IGJ5dGVbMzJdCgliICp3aGlsZV8xCgoqd2hpbGVfMV9lbmQ6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjM4NQoJLy8gdGhpcy5jb21taXRzKGNvbW1pdElkKS5kZWxldGUoKQoJYnl0ZWMgMSAvLyAgImMiCglmcmFtZV9kaWcgLTEgLy8gY29tbWl0SWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cglib3hfZGVsCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozODYKCS8vIHRoaXMucGVuZGluZy52YWx1ZSA9IHRoaXMucGVuZGluZy52YWx1ZSAtIDEKCWJ5dGVjIDUgLy8gICJwZW5kaW5nIgoJZHVwCglhcHBfZ2xvYmFsX2dldAoJaW50YyAxIC8vIDEKCS0KCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozODcKCS8vIHRoaXMubmV4dFJldmVhbC52YWx1ZSA9IGNvbW1pdElkICsgMQoJYnl0ZWMgMTEgLy8gICJuZXh0X3JldmVhbCIKCWZyYW1lX2RpZyAtMSAvLyBjb21taXRJZDogdWludDY0CglpbnRjIDEgLy8gMQoJKwoJYXBwX2dsb2JhbF9wdXQKCgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czozODkKCS8vIGFzc2V0SWQgPT09IDAKCWZyYW1lX2RpZyA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJaW50YyAwIC8vIDAKCT09CglieiAqaWY2X2Vsc2UKCgkvLyAqaWY2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6MzkxCgkvLyB0aGlzLnNhZmVSZWZ1bmQoYnV5ZXIsIHByaWNlICsgcmV2ZWFsRmVlICsgcmVmdW5kYWJsZSkKCWZyYW1lX2RpZyAyIC8vIHByaWNlOiB1aW50NjQKCWZyYW1lX2RpZyAzIC8vIHJldmVhbEZlZTogdWludDY0CgkrCglmcmFtZV9kaWcgNCAvLyByZWZ1bmRhYmxlOiB1aW50NjQKCSsKCWZyYW1lX2RpZyAwIC8vIGJ1eWVyOiBhZGRyZXNzCgljYWxsc3ViIHNhZmVSZWZ1bmQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjM5MgoJLy8gdGhpcy5DYW5jZWxsZWQubG9nKHsgY29tbWl0SWQ6IGNvbW1pdElkLCBidXllcjogYnV5ZXIgfSkKCWJ5dGVjIDIzIC8vICBDYW5jZWxsZWQodWludDY0LGFkZHJlc3MpCglmcmFtZV9kaWcgLTEgLy8gY29tbWl0SWQ6IHVpbnQ2NAoJaXRvYgoJZnJhbWVfZGlnIDAgLy8gYnV5ZXI6IGFkZHJlc3MKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWIgKmlmNl9lbmQKCippZjZfZWxzZToKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6Mzk0CgkvLyBhc3NldCA9IEFzc2V0SUQuZnJvbVVpbnQ2NChhc3NldElkKQoJZnJhbWVfZGlnIDYgLy8gYXNzZXRJZDogdWludDY0CglmcmFtZV9idXJ5IDkgLy8gYXNzZXQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6Mzk1CgkvLyBpbmJveENvc3QgPSB0aGlzLmRlbGl2ZXIoYXNzZXQsIGJ1eWVyLCByZWZ1bmRhYmxlLCBwcmljZSkKCWZyYW1lX2RpZyAyIC8vIHByaWNlOiB1aW50NjQKCWZyYW1lX2RpZyA0IC8vIHJlZnVuZGFibGU6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gYnV5ZXI6IGFkZHJlc3MKCWZyYW1lX2RpZyA5IC8vIGFzc2V0OiB1aW50NjQKCWNhbGxzdWIgZGVsaXZlcgoJZnJhbWVfYnVyeSAxMCAvLyBpbmJveENvc3Q6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6Mzk4CgkvLyBmcm9tUHJpY2UgPSAwCglpbnRjIDAgLy8gMAoJZnJhbWVfYnVyeSAxMSAvLyBmcm9tUHJpY2U6IHVpbnQ2NAoKCS8vICppZjdfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjM5OQoJLy8gaW5ib3hDb3N0ID4gcmVmdW5kYWJsZQoJZnJhbWVfZGlnIDEwIC8vIGluYm94Q29zdDogdWludDY0CglmcmFtZV9kaWcgNCAvLyByZWZ1bmRhYmxlOiB1aW50NjQKCT4KCWJ6ICppZjdfZW5kCgoJLy8gKmlmN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQwMAoJLy8gZnJvbVByaWNlID0gaW5ib3hDb3N0IC0gcmVmdW5kYWJsZQoJZnJhbWVfZGlnIDEwIC8vIGluYm94Q29zdDogdWludDY0CglmcmFtZV9kaWcgNCAvLyByZWZ1bmRhYmxlOiB1aW50NjQKCS0KCWZyYW1lX2J1cnkgMTEgLy8gZnJvbVByaWNlOiB1aW50NjQKCippZjdfZW5kOgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo0MDMKCS8vIHRoaXMuc29sZC52YWx1ZSA9IHRoaXMuc29sZC52YWx1ZSArIDEKCWJ5dGVjIDEwIC8vICAic29sZCIKCWR1cAoJYXBwX2dsb2JhbF9nZXQKCWludGMgMSAvLyAxCgkrCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDA0CgkvLyB0aGlzLnByb2NlZWRzLnZhbHVlID0gdGhpcy5wcm9jZWVkcy52YWx1ZSArIHByaWNlIC0gZnJvbVByaWNlCglieXRlYyA3IC8vICAicHJvY2VlZHMiCglkdXAKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgMiAvLyBwcmljZTogdWludDY0CgkrCglmcmFtZV9kaWcgMTEgLy8gZnJvbVByaWNlOiB1aW50NjQKCS0KCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo0MDYKCS8vIHNlbmRQYXltZW50KHsgcmVjZWl2ZXI6IHRoaXMudHhuLnNlbmRlciwgYW1vdW50OiByZXZlYWxGZWUsIGZlZTogMCB9KQoJaXR4bl9iZWdpbgoJaW50YyAxIC8vICBwYXkKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQwNgoJLy8gcmVjZWl2ZXI6IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJaXR4bl9maWVsZCBSZWNlaXZlcgoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDA2CgkvLyBhbW91bnQ6IHJldmVhbEZlZQoJZnJhbWVfZGlnIDMgLy8gcmV2ZWFsRmVlOiB1aW50NjQKCWl0eG5fZmllbGQgQW1vdW50CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo0MDYKCS8vIGZlZTogMAoJaW50YyAwIC8vIDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDA4CgkvLyB0aGlzLlJldmVhbGVkLmxvZyh7IGNvbW1pdElkOiBjb21taXRJZCwgYnV5ZXI6IGJ1eWVyLCBhc3NldDogYXNzZXQsIGluYm94Q29zdDogaW5ib3hDb3N0IH0pCglwdXNoYnl0ZXMgMHgzNWQyNTEyZSAvLyBSZXZlYWxlZCh1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0KQoJZnJhbWVfZGlnIC0xIC8vIGNvbW1pdElkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIGJ1eWVyOiBhZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyA5IC8vIGFzc2V0OiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIDEwIC8vIGluYm94Q29zdDogdWludDY0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo0MTAKCS8vIHNlbmRNZXRob2RDYWxsPFt1aW50NjQsIEFzc2V0SUQsIEFkZHJlc3MsIHVpbnQ2NCwgdWludDY0LCB1aW50NjRdLCB2b2lkPih7CgkvLyAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IHRoaXMuZmFjdG9yeS52YWx1ZSwKCS8vICAgICAgICAgbmFtZTogJ2xvZ1B1cmNoYXNlJywKCS8vICAgICAgICAgbWV0aG9kQXJnczogW3RoaXMuc2FsZUlkLnZhbHVlLCBhc3NldCwgYnV5ZXIsIHByaWNlLCB0aGlzLnNvbGQudmFsdWUsIHRoaXMucmVtYWluaW5nLnZhbHVlXSwKCS8vICAgICAgICAgZmVlOiAwLAoJLy8gICAgICAgfSkKCWl0eG5fYmVnaW4KCWludGMgOCAvLyAgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJcHVzaGJ5dGVzIDB4ZDUwMDU4NmMgLy8gbWV0aG9kICJsb2dQdXJjaGFzZSh1aW50NjQsdWludDY0LGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo0MTEKCS8vIGFwcGxpY2F0aW9uSUQ6IHRoaXMuZmFjdG9yeS52YWx1ZQoJYnl0ZWMgMTYgLy8gICJmYWN0b3J5IgoJYXBwX2dsb2JhbF9nZXQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDEzCgkvLyBtZXRob2RBcmdzOiBbdGhpcy5zYWxlSWQudmFsdWUsIGFzc2V0LCBidXllciwgcHJpY2UsIHRoaXMuc29sZC52YWx1ZSwgdGhpcy5yZW1haW5pbmcudmFsdWVdCglieXRlYyAxNSAvLyAgInNhbGVfaWQiCglhcHBfZ2xvYmFsX2dldAoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyA5IC8vIGFzc2V0OiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyBidXllcjogYWRkcmVzcwoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAyIC8vIHByaWNlOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglieXRlYyAxMCAvLyAgInNvbGQiCglhcHBfZ2xvYmFsX2dldAoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWJ5dGVjIDMgLy8gICJyZW1haW5pbmciCglhcHBfZ2xvYmFsX2dldAoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQxNAoJLy8gZmVlOiAwCglpbnRjIDAgLy8gMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CgoqaWY2X2VuZDoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQxOAoJLy8gdGhpcy5yZW1haW5pbmcudmFsdWUgPT09IDAgJiYgdGhpcy5wZW5kaW5nLnZhbHVlID09PSAwCglieXRlYyAzIC8vICAicmVtYWluaW5nIgoJYXBwX2dsb2JhbF9nZXQKCWludGMgMCAvLyAwCgk9PQoJZHVwCglieiAqc2tpcF9hbmQyCglieXRlYyA1IC8vICAicGVuZGluZyIKCWFwcF9nbG9iYWxfZ2V0CglpbnRjIDAgLy8gMAoJPT0KCSYmCgoqc2tpcF9hbmQyOgoJYnogKmlmOF9lbmQKCgkvLyAqaWY4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDE5CgkvLyB0aGlzLmRvUmVsZWFzZSgpCgljYWxsc3ViIGRvUmVsZWFzZQoKKmlmOF9lbmQ6CglyZXRzdWIKCi8vIGNhbmNlbEV4cGlyZWQodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9jYW5jZWxFeHBpcmVkOgoJLy8gY29tbWl0SWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY2FuY2VsRXhwaXJlZCh1aW50NjQpdm9pZAoJY2FsbHN1YiBjYW5jZWxFeHBpcmVkCglpbnRjIDEgLy8gMQoJcmV0dXJuCgovLyBjYW5jZWxFeHBpcmVkKGNvbW1pdElkOiB1aW50NjQpOiB2b2lkCi8vCi8vIFJlZnVuZCBhIGNvbW1pdCBub2JvZHkgcmV2ZWFsZWQgd2l0aGluIFJFVkVBTF9XSU5ET1cgcm91bmRzIChpdHMgYmxvY2sgc2VlZCBpcyBubyBsb25nZXIKLy8gcmVhZGFibGUpLiBUaGUgcmV2ZWFsIGJvdW50eSBtYWtlcyBpdCBwcm9maXRhYmxlIGZvciBhbnlvbmUgdG8gcmV2ZWFsIGxvbmcgYmVmb3JlIHRoaXMsCi8vIGFuZCB0aGUgYnV5ZXIncyBvd24gcGFnZSByZXZlYWxzIHRvby4KY2FuY2VsRXhwaXJlZDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlYyAwIC8vIDB4CglkdXAKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQzMAoJLy8gYXNzZXJ0KGNvbW1pdElkID09PSB0aGlzLm5leHRSZXZlYWwudmFsdWUpCglmcmFtZV9kaWcgLTEgLy8gY29tbWl0SWQ6IHVpbnQ2NAoJYnl0ZWMgMTEgLy8gICJuZXh0X3JldmVhbCIKCWFwcF9nbG9iYWxfZ2V0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo0MzEKCS8vIGFzc2VydCh0aGlzLmNvbW1pdHMoY29tbWl0SWQpLmV4aXN0cykKCWJ5dGVjIDEgLy8gICJjIgoJZnJhbWVfZGlnIC0xIC8vIGNvbW1pdElkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCglhc3NlcnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQzMwoJLy8gYnV5ZXIgPSB0aGlzLmNvbW1pdHMoY29tbWl0SWQpLnZhbHVlLmJ1eWVyCglpbnRjIDAgLy8gMAoJaW50YyA0IC8vIDMyCglieXRlYyAxIC8vICAiYyIKCWZyYW1lX2RpZyAtMSAvLyBjb21taXRJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDAgLy8gYnV5ZXI6IGFkZHJlc3MKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQzNAoJLy8gYW1vdW50ID0KCS8vICAgICAgIHRoaXMuY29tbWl0cyhjb21taXRJZCkudmFsdWUucHJpY2UgKwoJLy8gICAgICAgdGhpcy5jb21taXRzKGNvbW1pdElkKS52YWx1ZS5yZXZlYWxGZWUgKwoJLy8gICAgICAgdGhpcy5jb21taXRzKGNvbW1pdElkKS52YWx1ZS5kZXBvc2l0ICsKCS8vICAgICAgIHRoaXMuY29tbWl0cyhjb21taXRJZCkudmFsdWUuYm94TWJyCglpbnRjIDMgLy8gIGhlYWRPZmZzZXQKCWludGMgMiAvLyA4CglieXRlYyAxIC8vICAiYyIKCWZyYW1lX2RpZyAtMSAvLyBjb21taXRJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglpbnRjIDUgLy8gIGhlYWRPZmZzZXQKCWludGMgMiAvLyA4CglieXRlYyAxIC8vICAiYyIKCWZyYW1lX2RpZyAtMSAvLyBjb21taXRJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgkrCglpbnRjIDEzIC8vICBoZWFkT2Zmc2V0CglpbnRjIDIgLy8gOAoJYnl0ZWMgMSAvLyAgImMiCglmcmFtZV9kaWcgLTEgLy8gY29tbWl0SWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJKwoJaW50YyAxNCAvLyAgaGVhZE9mZnNldAoJaW50YyAyIC8vIDgKCWJ5dGVjIDEgLy8gICJjIgoJZnJhbWVfZGlnIC0xIC8vIGNvbW1pdElkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCSsKCWZyYW1lX2J1cnkgMSAvLyBhbW91bnQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDM5CgkvLyBhc3NlcnQoZ2xvYmFscy5yb3VuZCA+IHRoaXMuY29tbWl0cyhjb21taXRJZCkudmFsdWUudGFyZ2V0Um91bmQgKyBSRVZFQUxfV0lORE9XKQoJZ2xvYmFsIFJvdW5kCglpbnRjIDQgLy8gIGhlYWRPZmZzZXQKCWludGMgMiAvLyA4CglieXRlYyAxIC8vICAiYyIKCWZyYW1lX2RpZyAtMSAvLyBjb21taXRJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglwdXNoaW50IDEwMDAKCSsKCT4KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDQxCgkvLyB0aGlzLmNvbW1pdHMoY29tbWl0SWQpLmRlbGV0ZSgpCglieXRlYyAxIC8vICAiYyIKCWZyYW1lX2RpZyAtMSAvLyBjb21taXRJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9kZWwKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQ0MgoJLy8gdGhpcy5wZW5kaW5nLnZhbHVlID0gdGhpcy5wZW5kaW5nLnZhbHVlIC0gMQoJYnl0ZWMgNSAvLyAgInBlbmRpbmciCglkdXAKCWFwcF9nbG9iYWxfZ2V0CglpbnRjIDEgLy8gMQoJLQoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQ0MwoJLy8gdGhpcy5uZXh0UmV2ZWFsLnZhbHVlID0gY29tbWl0SWQgKyAxCglieXRlYyAxMSAvLyAgIm5leHRfcmV2ZWFsIgoJZnJhbWVfZGlnIC0xIC8vIGNvbW1pdElkOiB1aW50NjQKCWludGMgMSAvLyAxCgkrCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDQ1CgkvLyB0aGlzLnNhZmVSZWZ1bmQoYnV5ZXIsIGFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIGFtb3VudDogdWludDY0CglmcmFtZV9kaWcgMCAvLyBidXllcjogYWRkcmVzcwoJY2FsbHN1YiBzYWZlUmVmdW5kCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo0NDYKCS8vIHRoaXMuQ2FuY2VsbGVkLmxvZyh7IGNvbW1pdElkOiBjb21taXRJZCwgYnV5ZXI6IGJ1eWVyIH0pCglieXRlYyAyMyAvLyAgQ2FuY2VsbGVkKHVpbnQ2NCxhZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIGNvbW1pdElkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIGJ1eWVyOiBhZGRyZXNzCgljb25jYXQKCWNvbmNhdAoJbG9nCglyZXRzdWIKCi8vIHJlbGVhc2UoKXZvaWQKKmFiaV9yb3V0ZV9yZWxlYXNlOgoJLy8gZXhlY3V0ZSByZWxlYXNlKCl2b2lkCgljYWxsc3ViIHJlbGVhc2UKCWludGMgMSAvLyAxCglyZXR1cm4KCi8vIHJlbGVhc2UoKTogdm9pZAovLwovLyBSZWtleSB0aGUgZGlzdHJpYnV0aW9uIHdhbGxldCBiYWNrIHRvIGl0c2VsZi4gUmVxdWlyZXMgbm8gcGVuZGluZyBjb21taXRzIChwYXVzZSBmaXJzdCwKLy8gdGhlbiBsZXQgdGhlbSBiZSByZXZlYWxlZCkuIEFsbG93ZWQgZm9yIHRoZSBhZG1pbiBhdCBhbnkgdGltZSwgb3IgZm9yIGFueW9uZSBvbmNlIHRoZQovLyBzYWxlIGhhcyBlbmRlZCBvciBzb2xkIG91dCwgc28gdGhlIHdhbGxldCBjYW4gbmV2ZXIgYmUgc3R1Y2suCnJlbGVhc2U6Cglwcm90byAwIDAKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQ1OQoJLy8gYXNzZXJ0KHRoaXMuc3RhdHVzLnZhbHVlICE9PSBTVEFUVVNfUkVMRUFTRUQpCglieXRlYyAyIC8vICAic3RhdHVzIgoJYXBwX2dsb2JhbF9nZXQKCWludGMgNyAvLyAzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo0NjAKCS8vIGFzc2VydCh0aGlzLnBlbmRpbmcudmFsdWUgPT09IDApCglieXRlYyA1IC8vICAicGVuZGluZyIKCWFwcF9nbG9iYWxfZ2V0CglpbnRjIDAgLy8gMAoJPT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDYxCgkvLyBhc3NlcnQoCgkvLyAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW4udmFsdWUgfHwgZ2xvYmFscy5yb3VuZCA+IHRoaXMuZW5kUm91bmQudmFsdWUgfHwgdGhpcy5yZW1haW5pbmcudmFsdWUgPT09IDAKCS8vICAgICApCgl0eG4gU2VuZGVyCglieXRlYyA5IC8vICAiYWRtaW4iCglhcHBfZ2xvYmFsX2dldAoJPT0KCWR1cAoJYm56ICpza2lwX29yMQoJZ2xvYmFsIFJvdW5kCglieXRlYyAxMiAvLyAgImVuZCIKCWFwcF9nbG9iYWxfZ2V0Cgk+Cgl8fAoKKnNraXBfb3IxOgoJZHVwCglibnogKnNraXBfb3IyCglieXRlYyAzIC8vICAicmVtYWluaW5nIgoJYXBwX2dsb2JhbF9nZXQKCWludGMgMCAvLyAwCgk9PQoJfHwKCipza2lwX29yMjoKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDY0CgkvLyB0aGlzLmRvUmVsZWFzZSgpCgljYWxsc3ViIGRvUmVsZWFzZQoJcmV0c3ViCgovLyB3aXRoZHJhd1Byb2NlZWRzKCl2b2lkCiphYmlfcm91dGVfd2l0aGRyYXdQcm9jZWVkczoKCS8vIGV4ZWN1dGUgd2l0aGRyYXdQcm9jZWVkcygpdm9pZAoJY2FsbHN1YiB3aXRoZHJhd1Byb2NlZWRzCglpbnRjIDEgLy8gMQoJcmV0dXJuCgovLyB3aXRoZHJhd1Byb2NlZWRzKCk6IHZvaWQKLy8KLy8gU3BsaXQgYWNjdW11bGF0ZWQgc2FsZSBwcm9jZWVkcyBiZXR3ZWVuIHRoZSBwYXlvdXQgYWRkcmVzc2VzLiBDYWxsYWJsZSBieSBhbnlvbmUuCndpdGhkcmF3UHJvY2VlZHM6Cglwcm90byAwIDAKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQ2OQoJLy8gYXNzZXJ0KHRoaXMucHJvY2VlZHMudmFsdWUgPiAwKQoJYnl0ZWMgNyAvLyAgInByb2NlZWRzIgoJYXBwX2dsb2JhbF9nZXQKCWludGMgMCAvLyAwCgk+Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQ3MAoJLy8gdGhpcy5wYXlQcm9jZWVkcygpCgljYWxsc3ViIHBheVByb2NlZWRzCglyZXRzdWIKCi8vIGRlbGV0ZUl0ZW1QYWdlKHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfZGVsZXRlSXRlbVBhZ2U6CgkvLyBwYWdlOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGRlbGV0ZUl0ZW1QYWdlKHVpbnQ2NCl2b2lkCgljYWxsc3ViIGRlbGV0ZUl0ZW1QYWdlCglpbnRjIDEgLy8gMQoJcmV0dXJuCgovLyBkZWxldGVJdGVtUGFnZShwYWdlOiB1aW50NjQpOiB2b2lkCi8vCi8vIEZyZWUgbGVmdG92ZXIgaXRlbSBwYWdlcyBhZnRlciByZWxlYXNlIHNvIHRoZSBhcHAgY2FuIGJlIGRlbGV0ZWQuIENhbGxhYmxlIGJ5IGFueW9uZS4KZGVsZXRlSXRlbVBhZ2U6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQ3NQoJLy8gYXNzZXJ0KHRoaXMuc3RhdHVzLnZhbHVlID09PSBTVEFUVVNfUkVMRUFTRUQpCglieXRlYyAyIC8vICAic3RhdHVzIgoJYXBwX2dsb2JhbF9nZXQKCWludGMgNyAvLyAzCgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo0NzYKCS8vIGFzc2VydCh0aGlzLml0ZW1zKHBhZ2UpLmV4aXN0cykKCWJ5dGVjIDggLy8gICJpIgoJZnJhbWVfZGlnIC0xIC8vIHBhZ2U6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDc3CgkvLyB0aGlzLml0ZW1zKHBhZ2UpLmRlbGV0ZSgpCglieXRlYyA4IC8vICAiaSIKCWZyYW1lX2RpZyAtMSAvLyBwYWdlOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYm94X2RlbAoJcmV0c3ViCgovLyBvcFVwKCl2b2lkCiphYmlfcm91dGVfb3BVcDoKCS8vIGV4ZWN1dGUgb3BVcCgpdm9pZAoJY2FsbHN1YiBvcFVwCglpbnRjIDEgLy8gMQoJcmV0dXJuCgovLyBvcFVwKCk6IHZvaWQKLy8KLy8gTm8tb3AuIEdyb3VwZWQgYWxvbmdzaWRlIGhlYXZ5IGNhbGxzIChyZXZlYWwpIHRvIHBvb2wgZXh0cmEgb3Bjb2RlIGJ1ZGdldC4Kb3BVcDoKCXByb3RvIDAgMAoJcmV0c3ViCgovLyBkZWxldGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX2RlbGV0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSBkZWxldGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiBkZWxldGVBcHBsaWNhdGlvbgoJaW50YyAxIC8vIDEKCXJldHVybgoKLy8gZGVsZXRlQXBwbGljYXRpb24oKTogdm9pZAovLwovLyBDYWxsZWQgYnkgdGhlIGZhY3RvcnkncyBkZWxldGVTYWxlLiBQYXlzIG91dCBwcm9jZWVkcywgdGhlbiBjbG9zZXMgdGhlIGFjY291bnQgdG8gdGhlCi8vIGRpc3RyaWJ1dGlvbiB3YWxsZXQsIHdoaWNoIHBhaWQgdGhlIGRlcG9zaXRzLgpkZWxldGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDg4CgkvLyBhc3NlcnQodGhpcy50eG4uc2VuZGVyID09PSB0aGlzLmFwcC5jcmVhdG9yKQoJdHhuIFNlbmRlcgoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgoJcG9wCgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo0ODkKCS8vIGFzc2VydCh0aGlzLnN0YXR1cy52YWx1ZSA9PT0gU1RBVFVTX1JFTEVBU0VEKQoJYnl0ZWMgMiAvLyAgInN0YXR1cyIKCWFwcF9nbG9iYWxfZ2V0CglpbnRjIDcgLy8gMwoJPT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDkwCgkvLyBhc3NlcnQodGhpcy5wZW5kaW5nLnZhbHVlID09PSAwKQoJYnl0ZWMgNSAvLyAgInBlbmRpbmciCglhcHBfZ2xvYmFsX2dldAoJaW50YyAwIC8vIDAKCT09Cglhc3NlcnQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo0OTQKCS8vIHRoaXMucHJvY2VlZHMudmFsdWUgPiAwCglieXRlYyA3IC8vICAicHJvY2VlZHMiCglhcHBfZ2xvYmFsX2dldAoJaW50YyAwIC8vIDAKCT4KCWJ6ICppZjlfZW5kCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjQ5NQoJLy8gdGhpcy5wYXlQcm9jZWVkcygpCgljYWxsc3ViIHBheVByb2NlZWRzCgoqaWY5X2VuZDoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDk4CgkvLyB0aGlzLnBheW91dHMuZGVsZXRlKCkKCWJ5dGVjIDQgLy8gICJwIgoJYm94X2RlbAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NDk5CgkvLyBhc3NlcnQodGhpcy5hcHAuYWRkcmVzcy50b3RhbEJveGVzID09PSAwKQoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxCb3hlcwoJcG9wCglpbnRjIDAgLy8gMAoJPT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTAxCgkvLyBzZW5kUGF5bWVudCh7CgkvLyAgICAgICByZWNlaXZlcjogdGhpcy5kaXN0cmlidXRpb24udmFsdWUsCgkvLyAgICAgICBhbW91bnQ6IDAsCgkvLyAgICAgICBjbG9zZVJlbWFpbmRlclRvOiB0aGlzLmRpc3RyaWJ1dGlvbi52YWx1ZSwKCS8vICAgICAgIGZlZTogMCwKCS8vICAgICB9KQoJaXR4bl9iZWdpbgoJaW50YyAxIC8vICBwYXkKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjUwMgoJLy8gcmVjZWl2ZXI6IHRoaXMuZGlzdHJpYnV0aW9uLnZhbHVlCglieXRlYyA2IC8vICAiZGlzdHJpYnV0aW9uIgoJYXBwX2dsb2JhbF9nZXQKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjUwMwoJLy8gYW1vdW50OiAwCglpbnRjIDAgLy8gMAoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjUwNAoJLy8gY2xvc2VSZW1haW5kZXJUbzogdGhpcy5kaXN0cmlidXRpb24udmFsdWUKCWJ5dGVjIDYgLy8gICJkaXN0cmlidXRpb24iCglhcHBfZ2xvYmFsX2dldAoJaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1MDUKCS8vIGZlZTogMAoJaW50YyAwIC8vIDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJcmV0c3ViCgovLyB0YWtlSXRlbShpbmRleDogdWludDY0KTogdWludDY0Ci8vCi8vIFJlbW92ZSB0aGUgaXRlbSBhdCBgaW5kZXhgIChzd2FwIHdpdGggbGFzdCwgc2hyaW5rKSBhbmQgcmV0dXJuIGl0cyBhc3NldCBJRC4KdGFrZUl0ZW06Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZWMgMCAvLyAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1MTUKCS8vIGxhc3RJbmRleCA9IHRoaXMucmVtYWluaW5nLnZhbHVlIC0gMQoJYnl0ZWMgMyAvLyAgInJlbWFpbmluZyIKCWFwcF9nbG9iYWxfZ2V0CglpbnRjIDEgLy8gMQoJLQoJZnJhbWVfYnVyeSAwIC8vIGxhc3RJbmRleDogdWludDY0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1MTYKCS8vIHBhZ2UgPSBpbmRleCAvIFBBR0VfSVRFTVMKCWZyYW1lX2RpZyAtMSAvLyBpbmRleDogdWludDY0CglpbnRjIDYgLy8gMTI4CgkvCglmcmFtZV9idXJ5IDEgLy8gcGFnZTogdWludDY0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1MTcKCS8vIG9mZnNldCA9IChpbmRleCAlIFBBR0VfSVRFTVMpICogOAoJZnJhbWVfZGlnIC0xIC8vIGluZGV4OiB1aW50NjQKCWludGMgNiAvLyAxMjgKCSUKCWludGMgMiAvLyA4CgkqCglmcmFtZV9idXJ5IDIgLy8gb2Zmc2V0OiB1aW50NjQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjUxOAoJLy8gdmFsdWUgPSBidG9pKHRoaXMuaXRlbXMocGFnZSkuZXh0cmFjdChvZmZzZXQsIDgpKQoJYnl0ZWMgOCAvLyAgImkiCglmcmFtZV9kaWcgMSAvLyBwYWdlOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIDIgLy8gb2Zmc2V0OiB1aW50NjQKCWludGMgMiAvLyA4Cglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIHZhbHVlOiB1aW50NjQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjUyMAoJLy8gbGFzdFBhZ2UgPSBsYXN0SW5kZXggLyBQQUdFX0lURU1TCglmcmFtZV9kaWcgMCAvLyBsYXN0SW5kZXg6IHVpbnQ2NAoJaW50YyA2IC8vIDEyOAoJLwoJZnJhbWVfYnVyeSA0IC8vIGxhc3RQYWdlOiB1aW50NjQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjUyMQoJLy8gbGFzdE9mZnNldCA9IChsYXN0SW5kZXggJSBQQUdFX0lURU1TKSAqIDgKCWZyYW1lX2RpZyAwIC8vIGxhc3RJbmRleDogdWludDY0CglpbnRjIDYgLy8gMTI4CgklCglpbnRjIDIgLy8gOAoJKgoJZnJhbWVfYnVyeSA1IC8vIGxhc3RPZmZzZXQ6IHVpbnQ2NAoKCS8vICppZjEwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1MjIKCS8vIGluZGV4ICE9PSBsYXN0SW5kZXgKCWZyYW1lX2RpZyAtMSAvLyBpbmRleDogdWludDY0CglmcmFtZV9kaWcgMCAvLyBsYXN0SW5kZXg6IHVpbnQ2NAoJIT0KCWJ6ICppZjEwX2VuZAoKCS8vICppZjEwX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTIzCgkvLyB0aGlzLml0ZW1zKHBhZ2UpLnJlcGxhY2Uob2Zmc2V0LCB0aGlzLml0ZW1zKGxhc3RQYWdlKS5leHRyYWN0KGxhc3RPZmZzZXQsIDgpKQoJYnl0ZWMgOCAvLyAgImkiCglmcmFtZV9kaWcgMSAvLyBwYWdlOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIDIgLy8gb2Zmc2V0OiB1aW50NjQKCWJ5dGVjIDggLy8gICJpIgoJZnJhbWVfZGlnIDQgLy8gbGFzdFBhZ2U6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgNSAvLyBsYXN0T2Zmc2V0OiB1aW50NjQKCWludGMgMiAvLyA4Cglib3hfZXh0cmFjdAoJYm94X3JlcGxhY2UKCippZjEwX2VuZDoKCS8vICppZjExX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1MjcKCS8vIGxhc3RPZmZzZXQgPT09IDAKCWZyYW1lX2RpZyA1IC8vIGxhc3RPZmZzZXQ6IHVpbnQ2NAoJaW50YyAwIC8vIDAKCT09CglieiAqaWYxMV9lbmQKCgkvLyAqaWYxMV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjUyOAoJLy8gdGhpcy5pdGVtcyhsYXN0UGFnZSkuZGVsZXRlKCkKCWJ5dGVjIDggLy8gICJpIgoJZnJhbWVfZGlnIDQgLy8gbGFzdFBhZ2U6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cglib3hfZGVsCgoqaWYxMV9lbmQ6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjUzMQoJLy8gdGhpcy5yZW1haW5pbmcudmFsdWUgPSBsYXN0SW5kZXgKCWJ5dGVjIDMgLy8gICJyZW1haW5pbmciCglmcmFtZV9kaWcgMCAvLyBsYXN0SW5kZXg6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjUzMgoJLy8gcmV0dXJuIHZhbHVlOwoJZnJhbWVfZGlnIDMgLy8gdmFsdWU6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gZGVsaXZlcihhc3NldDogQXNzZXRJRCwgYnV5ZXI6IEFkZHJlc3MsIHJlZnVuZGFibGU6IHVpbnQ2NCwgcHJpY2U6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBTZW5kIDEgdW5pdCBmcm9tIHRoZSBkaXN0cmlidXRpb24gd2FsbGV0IHRvIHRoZSBidXllciwgdG9nZXRoZXIgd2l0aCB0aGVpciByZWZ1bmRhYmxlCi8vIGRlcG9zaXQuIElmIHRoZXkgYXJlIG9wdGVkIGluLCBib3RoIGdvIGRpcmVjdGx5ICh0aGUgYWNjb3VudCBwcm92YWJseSBleGlzdHMsIHNvIHRoZQovLyByZWZ1bmQgY2Fubm90IGZhaWwpLiBPdGhlcndpc2UgdGhlIGFzc2V0IGdvZXMgdGhyb3VnaCB0aGUgQVJDLTU5IHJvdXRlcjogdGhlIGRlcG9zaXQgcGF5cwovLyB0aGUgaW5ib3ggTUJSIGFuZCBldmVyeXRoaW5nIGxlZnQgb3ZlciBpcyBzZW50IGFsb25nIGFzIGFkZGl0aW9uYWxSZWNlaXZlckZ1bmRzLCB3aGljaAovLyB0aGUgYnV5ZXIgZ2V0cyBiYWNrIHdoZW4gdGhleSBjbGFpbS4gUmV0dXJucyB0aGUgQUxHTyBzcGVudCBvbiBpbmJveCBNQlIuIFNob3VsZCB0aGUgaW5ib3gKLy8gY29zdCBtb3JlIHRoYW4gdGhlIGRlcG9zaXQgKHByb3RvY29sIE1CUiBpbmNyZWFzZSksIHRoZSBzaG9ydGZhbGwgY29tZXMgb3V0IG9mIGBwcmljZWAsIHNvIGEKLy8gYnV5ZXIgY2FuIG5ldmVyIG1ha2UgZGVsaXZlcnkgZmFpbCBieSBzdGF5aW5nIHVuLW9wdGVkLWluLgpkZWxpdmVyOgoJcHJvdG8gNCAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGVjIDAgLy8gMHgKCWR1cG4gNgoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTQ1CgkvLyBkaXN0ID0gdGhpcy5kaXN0cmlidXRpb24udmFsdWUKCWJ5dGVjIDYgLy8gICJkaXN0cmlidXRpb24iCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfYnVyeSAwIC8vIGRpc3Q6IGFkZHJlc3MKCgkvLyAqaWYxMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTQ3CgkvLyBidXllci5pc09wdGVkSW5Ub0Fzc2V0KGFzc2V0KQoJZnJhbWVfZGlnIC0yIC8vIGJ1eWVyOiBBZGRyZXNzCglmcmFtZV9kaWcgLTEgLy8gYXNzZXQ6IEFzc2V0SUQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJc3dhcAoJcG9wCglieiAqaWYxMl9lbmQKCgkvLyAqaWYxMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU0OAoJLy8gc2VuZEFzc2V0VHJhbnNmZXIoewoJLy8gICAgICAgICBzZW5kZXI6IGRpc3QsCgkvLyAgICAgICAgIHhmZXJBc3NldDogYXNzZXQsCgkvLyAgICAgICAgIGFzc2V0UmVjZWl2ZXI6IGJ1eWVyLAoJLy8gICAgICAgICBhc3NldEFtb3VudDogMSwKCS8vICAgICAgICAgZmVlOiAwLAoJLy8gICAgICAgfSkKCWl0eG5fYmVnaW4KCWludGMgMTIgLy8gIGF4ZmVyCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1NDkKCS8vIHNlbmRlcjogZGlzdAoJZnJhbWVfZGlnIDAgLy8gZGlzdDogYWRkcmVzcwoJaXR4bl9maWVsZCBTZW5kZXIKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU1MAoJLy8geGZlckFzc2V0OiBhc3NldAoJZnJhbWVfZGlnIC0xIC8vIGFzc2V0OiBBc3NldElECglpdHhuX2ZpZWxkIFhmZXJBc3NldAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTUxCgkvLyBhc3NldFJlY2VpdmVyOiBidXllcgoJZnJhbWVfZGlnIC0yIC8vIGJ1eWVyOiBBZGRyZXNzCglpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU1MgoJLy8gYXNzZXRBbW91bnQ6IDEKCWludGMgMSAvLyAxCglpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1NTMKCS8vIGZlZTogMAoJaW50YyAwIC8vIDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTU1CgkvLyBzZW5kUGF5bWVudCh7IHJlY2VpdmVyOiBidXllciwgYW1vdW50OiByZWZ1bmRhYmxlLCBmZWU6IDAgfSkKCWl0eG5fYmVnaW4KCWludGMgMSAvLyAgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1NTUKCS8vIHJlY2VpdmVyOiBidXllcgoJZnJhbWVfZGlnIC0yIC8vIGJ1eWVyOiBBZGRyZXNzCglpdHhuX2ZpZWxkIFJlY2VpdmVyCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1NTUKCS8vIGFtb3VudDogcmVmdW5kYWJsZQoJZnJhbWVfZGlnIC0zIC8vIHJlZnVuZGFibGU6IHVpbnQ2NAoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU1NQoJLy8gZmVlOiAwCglpbnRjIDAgLy8gMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1NTYKCS8vIHJldHVybiAwOwoJaW50YyAwIC8vIDAKCWIgKmRlbGl2ZXIqcmV0dXJuCgoqaWYxMl9lbmQ6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU1OQoJLy8gcm91dGVyID0gdGhpcy5yb3V0ZXIudmFsdWUKCWJ5dGVjIDIxIC8vICAiYXJjNTkiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfYnVyeSAxIC8vIHJvdXRlcjogdWludDY0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1NjEKCS8vIGluZm8gPSBzZW5kTWV0aG9kQ2FsbDxbQWRkcmVzcywgQXNzZXRJRF0sIFt1aW50NjQsIHVpbnQ2NCwgYm9vbGVhbiwgYm9vbGVhbiwgdWludDY0LCB1aW50NjRdPih7CgkvLyAgICAgICBhcHBsaWNhdGlvbklEOiByb3V0ZXIsCgkvLyAgICAgICBuYW1lOiAnYXJjNTlfZ2V0U2VuZEFzc2V0SW5mbycsCgkvLyAgICAgICBtZXRob2RBcmdzOiBbYnV5ZXIsIGFzc2V0XSwKCS8vICAgICAgIGZlZTogMCwKCS8vICAgICB9KQoJaXR4bl9iZWdpbgoJaW50YyA4IC8vICBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCglwdXNoYnl0ZXMgMHhjYWI1MWZjOCAvLyBtZXRob2QgImFyYzU5X2dldFNlbmRBc3NldEluZm8oYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLHVpbnQ2NCx1aW50NjQpIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU2MgoJLy8gYXBwbGljYXRpb25JRDogcm91dGVyCglmcmFtZV9kaWcgMSAvLyByb3V0ZXI6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1NjQKCS8vIG1ldGhvZEFyZ3M6IFtidXllciwgYXNzZXRdCglmcmFtZV9kaWcgLTIgLy8gYnV5ZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTEgLy8gYXNzZXQ6IEFzc2V0SUQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1NjUKCS8vIGZlZTogMAoJaW50YyAwIC8vIDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnRjIDEgLy8gMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglmcmFtZV9idXJ5IDIgLy8gaW5mbzogKHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLHVpbnQ2NCx1aW50NjQpCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1NjgKCS8vIGluZm9Mb2cgPSB0aGlzLml0eG4ubGFzdExvZwoJaXR4biBMYXN0TG9nCglmcmFtZV9idXJ5IDMgLy8gaW5mb0xvZzogYnl0ZVtdCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1NjkKCS8vIGFzc2VydChpbmZvTG9nLmxlbmd0aCA9PT0gQVJDNTlfSU5GT19MT0dfTEVOR1RIKQoJZnJhbWVfZGlnIDMgLy8gaW5mb0xvZzogYnl0ZVtdCglsZW4KCXB1c2hpbnQgMzcKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU3MAoJLy8gYXNzZXJ0KGV4dHJhY3QzKGluZm9Mb2csIDAsIDQpID09PSBoZXgoJzB4MTUxZjdjNzUnKSkKCWZyYW1lX2RpZyAzIC8vIGluZm9Mb2c6IGJ5dGVbXQoJZXh0cmFjdCAwIDQKCWJ5dGVjIDIyIC8vIDB4MTUxZjdjNzUKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU3MgoJLy8gcm91dGVyTWJyID0gaW5mb1sxXQoJZnJhbWVfZGlnIDIgLy8gaW5mbzogKHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLHVpbnQ2NCx1aW50NjQpCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWZyYW1lX2J1cnkgNCAvLyByb3V0ZXJNYnI6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTczCgkvLyBhc3NlcnQocm91dGVyTWJyIDw9IHJlZnVuZGFibGUgKyBwcmljZSkKCWZyYW1lX2RpZyA0IC8vIHJvdXRlck1icjogdWludDY0CglmcmFtZV9kaWcgLTMgLy8gcmVmdW5kYWJsZTogdWludDY0CglmcmFtZV9kaWcgLTQgLy8gcHJpY2U6IHVpbnQ2NAoJKwoJPD0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTc0CgkvLyBmdW5kcyA9IHJlZnVuZGFibGUKCWZyYW1lX2RpZyAtMyAvLyByZWZ1bmRhYmxlOiB1aW50NjQKCWZyYW1lX2J1cnkgNSAvLyBmdW5kczogdWludDY0CgoJLy8gKmlmMTNfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU3NQoJLy8gcm91dGVyTWJyID4gcmVmdW5kYWJsZQoJZnJhbWVfZGlnIDQgLy8gcm91dGVyTWJyOiB1aW50NjQKCWZyYW1lX2RpZyAtMyAvLyByZWZ1bmRhYmxlOiB1aW50NjQKCT4KCWJ6ICppZjEzX2VuZAoKCS8vICppZjEzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTc2CgkvLyBmdW5kcyA9IHJvdXRlck1icgoJZnJhbWVfZGlnIDQgLy8gcm91dGVyTWJyOiB1aW50NjQKCWZyYW1lX2J1cnkgNSAvLyBmdW5kczogdWludDY0CgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU3OAoJLy8gY2xhaW1BbGdvID0gZnVuZHMgLSByb3V0ZXJNYnIKCWZyYW1lX2RpZyA1IC8vIGZ1bmRzOiB1aW50NjQKCWZyYW1lX2RpZyA0IC8vIHJvdXRlck1icjogdWludDY0CgktCglmcmFtZV9idXJ5IDYgLy8gY2xhaW1BbGdvOiB1aW50NjQKCgkvLyAqaWYxNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTgwCgkvLyBmdW5kcyA+IDAKCWZyYW1lX2RpZyA1IC8vIGZ1bmRzOiB1aW50NjQKCWludGMgMCAvLyAwCgk+CglieiAqaWYxNF9lbmQKCgkvLyAqaWYxNF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU4MQoJLy8gc2VuZFBheW1lbnQoeyByZWNlaXZlcjogcm91dGVyLmFkZHJlc3MsIGFtb3VudDogZnVuZHMsIGZlZTogMCB9KQoJaXR4bl9iZWdpbgoJaW50YyAxIC8vICBwYXkKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU4MQoJLy8gcmVjZWl2ZXI6IHJvdXRlci5hZGRyZXNzCglmcmFtZV9kaWcgMSAvLyByb3V0ZXI6IHVpbnQ2NAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJcG9wCglpdHhuX2ZpZWxkIFJlY2VpdmVyCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1ODEKCS8vIGFtb3VudDogZnVuZHMKCWZyYW1lX2RpZyA1IC8vIGZ1bmRzOiB1aW50NjQKCWl0eG5fZmllbGQgQW1vdW50CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1ODEKCS8vIGZlZTogMAoJaW50YyAwIC8vIDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMTRfZW5kOgoJLy8gKmlmMTVfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU4NAoJLy8gIWluZm9bMl0KCWZyYW1lX2RpZyAyIC8vIGluZm86ICh1aW50NjQsdWludDY0LGJvb2wsYm9vbCx1aW50NjQsdWludDY0KQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludGMgNiAvLyAxMjgKCWdldGJpdAoJIQoJYnogKmlmMTVfZW5kCgoJLy8gKmlmMTVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1ODUKCS8vIHNlbmRNZXRob2RDYWxsPFtBc3NldElEXSwgdm9pZD4oewoJLy8gICAgICAgICBhcHBsaWNhdGlvbklEOiByb3V0ZXIsCgkvLyAgICAgICAgIG5hbWU6ICdhcmM1OV9vcHRSb3V0ZXJJbicsCgkvLyAgICAgICAgIG1ldGhvZEFyZ3M6IFthc3NldF0sCgkvLyAgICAgICAgIGZlZTogMCwKCS8vICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnRjIDggLy8gIGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCXB1c2hieXRlcyAweGU4NTQwODEwIC8vIG1ldGhvZCAiYXJjNTlfb3B0Um91dGVySW4odWludDY0KXZvaWQiCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTg2CgkvLyBhcHBsaWNhdGlvbklEOiByb3V0ZXIKCWZyYW1lX2RpZyAxIC8vIHJvdXRlcjogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU4OAoJLy8gbWV0aG9kQXJnczogW2Fzc2V0XQoJZnJhbWVfZGlnIC0xIC8vIGFzc2V0OiBBc3NldElECglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTg5CgkvLyBmZWU6IDAKCWludGMgMCAvLyAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjE1X2VuZDoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTkzCgkvLyBzZW5kTWV0aG9kQ2FsbDxbQXNzZXRUcmFuc2ZlclR4biwgQWRkcmVzcywgdWludDY0XSwgQWRkcmVzcz4oewoJLy8gICAgICAgYXBwbGljYXRpb25JRDogcm91dGVyLAoJLy8gICAgICAgbmFtZTogJ2FyYzU5X3NlbmRBc3NldCcsCgkvLyAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgIHsKCS8vICAgICAgICAgICBzZW5kZXI6IGRpc3QsCgkvLyAgICAgICAgICAgeGZlckFzc2V0OiBhc3NldCwKCS8vICAgICAgICAgICBhc3NldFJlY2VpdmVyOiByb3V0ZXIuYWRkcmVzcywKCS8vICAgICAgICAgICBhc3NldEFtb3VudDogMSwKCS8vICAgICAgICAgICBmZWU6IDAsCgkvLyAgICAgICAgIH0sCgkvLyAgICAgICAgIGJ1eWVyLAoJLy8gICAgICAgICBjbGFpbUFsZ28sCgkvLyAgICAgICBdLAoJLy8gICAgICAgZmVlOiAwLAoJLy8gICAgIH0pCglpdHhuX2JlZ2luCglpbnRjIDEyIC8vICBheGZlcgoJaXR4bl9maWVsZCBUeXBlRW51bQoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NTk4CgkvLyBzZW5kZXI6IGRpc3QKCWZyYW1lX2RpZyAwIC8vIGRpc3Q6IGFkZHJlc3MKCWl0eG5fZmllbGQgU2VuZGVyCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1OTkKCS8vIHhmZXJBc3NldDogYXNzZXQKCWZyYW1lX2RpZyAtMSAvLyBhc3NldDogQXNzZXRJRAoJaXR4bl9maWVsZCBYZmVyQXNzZXQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjYwMAoJLy8gYXNzZXRSZWNlaXZlcjogcm91dGVyLmFkZHJlc3MKCWZyYW1lX2RpZyAxIC8vIHJvdXRlcjogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCWl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjAxCgkvLyBhc3NldEFtb3VudDogMQoJaW50YyAxIC8vIDEKCWl0eG5fZmllbGQgQXNzZXRBbW91bnQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjYwMgoJLy8gZmVlOiAwCglpbnRjIDAgLy8gMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fbmV4dAoJaW50YyA4IC8vICBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCglwdXNoYnl0ZXMgMHgwODUzMWVkNyAvLyBtZXRob2QgImFyYzU5X3NlbmRBc3NldChheGZlcixhZGRyZXNzLHVpbnQ2NClhZGRyZXNzIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjU5NAoJLy8gYXBwbGljYXRpb25JRDogcm91dGVyCglmcmFtZV9kaWcgMSAvLyByb3V0ZXI6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo1OTYKCS8vIG1ldGhvZEFyZ3M6IFsKCS8vICAgICAgICAgewoJLy8gICAgICAgICAgIHNlbmRlcjogZGlzdCwKCS8vICAgICAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAoJLy8gICAgICAgICAgIGFzc2V0UmVjZWl2ZXI6IHJvdXRlci5hZGRyZXNzLAoJLy8gICAgICAgICAgIGFzc2V0QW1vdW50OiAxLAoJLy8gICAgICAgICAgIGZlZTogMCwKCS8vICAgICAgICAgfSwKCS8vICAgICAgICAgYnV5ZXIsCgkvLyAgICAgICAgIGNsYWltQWxnbywKCS8vICAgICAgIF0KCWZyYW1lX2RpZyAtMiAvLyBidXllcjogQWRkcmVzcwoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyA2IC8vIGNsYWltQWxnbzogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjA3CgkvLyBmZWU6IDAKCWludGMgMCAvLyAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCWl0eG4gTnVtTG9ncwoJaW50YyAxIC8vIDEKCS0KCWl0eG5hcyBMb2dzCglleHRyYWN0IDQgMAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjEwCgkvLyByZXR1cm4gcm91dGVyTWJyOwoJZnJhbWVfZGlnIDQgLy8gcm91dGVyTWJyOiB1aW50NjQKCipkZWxpdmVyKnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDYKCXJldHN1YgoKLy8gcGF5UHJvY2VlZHMoKTogdm9pZAovLwovLyBQYXkgb3V0IHByb2NlZWRzLiBgcHJvY2VlZHNgIGlzIHRoZSB1bnNwbGl0IGJhbGFuY2UgcGx1cyBldmVyeSByZWNpcGllbnQncyBvd2VkIGFtb3VudC4gVGhlCi8vIHVuc3BsaXQgcGFydCBpcyBkaXZpZGVkIGJ5IHRoZSBwYXlvdXQgc3BsaXQgKHJvdW5kaW5nIGR1c3QgdG8gdGhlIGZpcnN0IHJlY2lwaWVudCk7IGVhY2gKLy8gcmVjaXBpZW50IHRoZW4gZ2V0cyB0aGVpciBzaGFyZSBwbHVzIGFueXRoaW5nIG93ZWQgdG8gdGhlbS4gQSByZWNpcGllbnQgd2hvIGNhbm5vdCByZWNlaXZlCi8vIChjbG9zZWQgYWNjb3VudCwgYW1vdW50IGJlbG93IHRoZSBtaW4gYmFsYW5jZSkga2VlcHMgaXQgYXMgb3dlZCwgZm9yIHRoZW0gYWxvbmUsIGluc3RlYWQgb2YKLy8gYmxvY2tpbmcgdGhlIG90aGVycyBvciBiZWluZyByZS1zcGxpdC4KcGF5UHJvY2VlZHM6Cglwcm90byAwIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZWMgMCAvLyAweAoJZHVwbiAxMAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjIxCgkvLyBzaXplID0gdGhpcy5wYXlvdXRzLnNpemUKCWJ5dGVjIDQgLy8gICJwIgoJYm94X2xlbgoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5wYXlvdXRzLnNpemUKCWFzc2VydAoJZnJhbWVfYnVyeSAwIC8vIHNpemU6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjIzCgkvLyBvd2VkVG90YWwgPSAwCglpbnRjIDAgLy8gMAoJZnJhbWVfYnVyeSAxIC8vIG93ZWRUb3RhbDogdWludDY0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2MjQKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSA9IGkgKyBQQVlPVVRfU1RPUkVEX0JZVEVTKQoJaW50YyAwIC8vIDAKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCipmb3JfMToKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjI0CgkvLyBpIDwgc2l6ZQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglmcmFtZV9kaWcgMCAvLyBzaXplOiB1aW50NjQKCTwKCWJ6ICpmb3JfMV9lbmQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjYyNQoJLy8gb3dlZFRvdGFsID0gb3dlZFRvdGFsICsgYnRvaSh0aGlzLnBheW91dHMuZXh0cmFjdChpICsgNDAsIDgpKQoJZnJhbWVfZGlnIDEgLy8gb3dlZFRvdGFsOiB1aW50NjQKCWJ5dGVjIDQgLy8gICJwIgoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnRjIDMgLy8gNDAKCSsKCWludGMgMiAvLyA4Cglib3hfZXh0cmFjdAoJYnRvaQoJKwoJZnJhbWVfYnVyeSAxIC8vIG93ZWRUb3RhbDogdWludDY0CgoqZm9yXzFfY29udGludWU6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjYyNAoJLy8gaSA9IGkgKyBQQVlPVVRfU1RPUkVEX0JZVEVTCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludGMgNSAvLyA0OAoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzEKCipmb3JfMV9lbmQ6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjYyNwoJLy8gYW1vdW50ID0gdGhpcy5wcm9jZWVkcy52YWx1ZSAtIG93ZWRUb3RhbAoJYnl0ZWMgNyAvLyAgInByb2NlZWRzIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAxIC8vIG93ZWRUb3RhbDogdWludDY0CgktCglmcmFtZV9idXJ5IDMgLy8gYW1vdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjYyOQoJLy8gYWxsb2NhdGVkID0gMAoJaW50YyAwIC8vIDAKCWZyYW1lX2J1cnkgNCAvLyBhbGxvY2F0ZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjMwCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkgPSBpICsgUEFZT1VUX1NUT1JFRF9CWVRFUykKCWludGMgMCAvLyAwCglmcmFtZV9idXJ5IDUgLy8gaTogdWludDY0CgoqZm9yXzI6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjYzMAoJLy8gaSA8IHNpemUKCWZyYW1lX2RpZyA1IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc2l6ZTogdWludDY0Cgk8CglieiAqZm9yXzJfZW5kCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2MzEKCS8vIGFsbG9jYXRlZCA9IGFsbG9jYXRlZCArIHdpZGVSYXRpbyhbYW1vdW50LCBidG9pKHRoaXMucGF5b3V0cy5leHRyYWN0KGkgKyAzMiwgOCkpXSwgW0JQU19UT1RBTF0pCglmcmFtZV9kaWcgNCAvLyBhbGxvY2F0ZWQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gYW1vdW50OiB1aW50NjQKCWJ5dGVjIDQgLy8gICJwIgoJZnJhbWVfZGlnIDUgLy8gaTogdWludDY0CglpbnRjIDQgLy8gMzIKCSsKCWludGMgMiAvLyA4Cglib3hfZXh0cmFjdAoJYnRvaQoJbXVsdwoJaW50YyAwIC8vIDAKCWludGMgMTAgLy8gMTAwMDAKCWRpdm1vZHcKCXBvcAoJcG9wCglzd2FwCgkhCgoJLy8gd2lkZVJhdGlvIGZhaWxlZAoJYXNzZXJ0CgkrCglmcmFtZV9idXJ5IDQgLy8gYWxsb2NhdGVkOiB1aW50NjQKCipmb3JfMl9jb250aW51ZToKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjMwCgkvLyBpID0gaSArIFBBWU9VVF9TVE9SRURfQllURVMKCWZyYW1lX2RpZyA1IC8vIGk6IHVpbnQ2NAoJaW50YyA1IC8vIDQ4CgkrCglmcmFtZV9idXJ5IDUgLy8gaTogdWludDY0CgliICpmb3JfMgoKKmZvcl8yX2VuZDoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjM0CgkvLyByZXRhaW5lZCA9IDAKCWludGMgMCAvLyAwCglmcmFtZV9idXJ5IDYgLy8gcmV0YWluZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjM1CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkgPSBpICsgUEFZT1VUX1NUT1JFRF9CWVRFUykKCWludGMgMCAvLyAwCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgoqZm9yXzM6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjYzNQoJLy8gaSA8IHNpemUKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc2l6ZTogdWludDY0Cgk8CglieiAqZm9yXzNfZW5kCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2MzYKCS8vIHJlY2VpdmVyID0gY2FzdEJ5dGVzPEFkZHJlc3M+KHRoaXMucGF5b3V0cy5leHRyYWN0KGksIDMyKSkKCWJ5dGVjIDQgLy8gICJwIgoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnRjIDQgLy8gMzIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDggLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjYzNwoJLy8gb3dlZCA9IGJ0b2kodGhpcy5wYXlvdXRzLmV4dHJhY3QoaSArIDQwLCA4KSkKCWJ5dGVjIDQgLy8gICJwIgoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnRjIDMgLy8gNDAKCSsKCWludGMgMiAvLyA4Cglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSA5IC8vIG93ZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjM4CgkvLyBkdWUgPSB3aWRlUmF0aW8oW2Ftb3VudCwgYnRvaSh0aGlzLnBheW91dHMuZXh0cmFjdChpICsgMzIsIDgpKV0sIFtCUFNfVE9UQUxdKSArIG93ZWQKCWZyYW1lX2RpZyAzIC8vIGFtb3VudDogdWludDY0CglieXRlYyA0IC8vICAicCIKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJaW50YyA0IC8vIDMyCgkrCglpbnRjIDIgLy8gOAoJYm94X2V4dHJhY3QKCWJ0b2kKCW11bHcKCWludGMgMCAvLyAwCglpbnRjIDEwIC8vIDEwMDAwCglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfZGlnIDkgLy8gb3dlZDogdWludDY0CgkrCglmcmFtZV9idXJ5IDEwIC8vIGR1ZTogdWludDY0CgoJLy8gKmlmMTZfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjYzOQoJLy8gaSA9PT0gMAoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnRjIDAgLy8gMAoJPT0KCWJ6ICppZjE2X2VuZAoKCS8vICppZjE2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjQwCgkvLyBkdWUgPSBkdWUgKyBhbW91bnQgLSBhbGxvY2F0ZWQKCWZyYW1lX2RpZyAxMCAvLyBkdWU6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gYW1vdW50OiB1aW50NjQKCSsKCWZyYW1lX2RpZyA0IC8vIGFsbG9jYXRlZDogdWludDY0CgktCglmcmFtZV9idXJ5IDEwIC8vIGR1ZTogdWludDY0CgoqaWYxNl9lbmQ6CgkvLyAqaWYxN19jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjQyCgkvLyBkdWUgPiAwCglmcmFtZV9kaWcgMTAgLy8gZHVlOiB1aW50NjQKCWludGMgMCAvLyAwCgk+CglieiAqaWYxN19lbmQKCgkvLyAqaWYxN19jb25zZXF1ZW50CgkvLyAqaWYxOF9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjQzCgkvLyB0aGlzLmNhblJlY2VpdmUocmVjZWl2ZXIsIGR1ZSkKCWZyYW1lX2RpZyAxMCAvLyBkdWU6IHVpbnQ2NAoJZnJhbWVfZGlnIDggLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCWNhbGxzdWIgY2FuUmVjZWl2ZQoJYnogKmlmMThfZWxzZQoKCS8vICppZjE4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjQ0CgkvLyBzZW5kUGF5bWVudCh7IHJlY2VpdmVyOiByZWNlaXZlciwgYW1vdW50OiBkdWUsIGZlZTogMCB9KQoJaXR4bl9iZWdpbgoJaW50YyAxIC8vICBwYXkKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjY0NAoJLy8gcmVjZWl2ZXI6IHJlY2VpdmVyCglmcmFtZV9kaWcgOCAvLyByZWNlaXZlcjogYWRkcmVzcwoJaXR4bl9maWVsZCBSZWNlaXZlcgoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjQ0CgkvLyBhbW91bnQ6IGR1ZQoJZnJhbWVfZGlnIDEwIC8vIGR1ZTogdWludDY0CglpdHhuX2ZpZWxkIEFtb3VudAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjQ0CgkvLyBmZWU6IDAKCWludGMgMCAvLyAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjQ1CgkvLyBvd2VkID4gMAoJZnJhbWVfZGlnIDkgLy8gb3dlZDogdWludDY0CglpbnRjIDAgLy8gMAoJPgoJYnogKmlmMTlfZW5kCgoJLy8gKmlmMTlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2NDYKCS8vIHRoaXMucGF5b3V0cy5yZXBsYWNlKGkgKyA0MCwgaXRvYigwKSkKCWJ5dGVjIDQgLy8gICJwIgoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnRjIDMgLy8gNDAKCSsKCXB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAKCWJveF9yZXBsYWNlCgoqaWYxOV9lbmQ6CgliICppZjE4X2VuZAoKKmlmMThfZWxzZToKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjQ5CgkvLyByZXRhaW5lZCA9IHJldGFpbmVkICsgZHVlCglmcmFtZV9kaWcgNiAvLyByZXRhaW5lZDogdWludDY0CglmcmFtZV9kaWcgMTAgLy8gZHVlOiB1aW50NjQKCSsKCWZyYW1lX2J1cnkgNiAvLyByZXRhaW5lZDogdWludDY0CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2NTAKCS8vIHRoaXMucGF5b3V0cy5yZXBsYWNlKGkgKyA0MCwgaXRvYihkdWUpKQoJYnl0ZWMgNCAvLyAgInAiCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludGMgMyAvLyA0MAoJKwoJZnJhbWVfZGlnIDEwIC8vIGR1ZTogdWludDY0CglpdG9iCglib3hfcmVwbGFjZQoKKmlmMThfZW5kOgoKKmlmMTdfZW5kOgoKKmZvcl8zX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2MzUKCS8vIGkgPSBpICsgUEFZT1VUX1NUT1JFRF9CWVRFUwoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnRjIDUgLy8gNDgKCSsKCWZyYW1lX2J1cnkgNyAvLyBpOiB1aW50NjQKCWIgKmZvcl8zCgoqZm9yXzNfZW5kOgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2NTQKCS8vIHRoaXMucHJvY2VlZHMudmFsdWUgPSByZXRhaW5lZAoJYnl0ZWMgNyAvLyAgInByb2NlZWRzIgoJZnJhbWVfZGlnIDYgLy8gcmV0YWluZWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCXJldHN1YgoKLy8gY2FuUmVjZWl2ZShhY2NvdW50OiBBZGRyZXNzLCBhbW91bnQ6IHVpbnQ2NCk6IGJvb2xlYW4KLy8KLy8gV2hldGhlciBhIHBheW1lbnQgb2YgYGFtb3VudGAgdG8gYGFjY291bnRgIGNhbiBzdWNjZWVkIChleGlzdGluZyBhY2NvdW50LCBvciBlbm91Z2ggdG8gZnVuZCBhIG5ldyBvbmUpCmNhblJlY2VpdmU6Cglwcm90byAyIDEKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjY1OQoJLy8gcmV0dXJuIGFjY291bnQuYmFsYW5jZSA+IDAgfHwgYW1vdW50ID49IGdsb2JhbHMubWluQmFsYW5jZTsKCWZyYW1lX2RpZyAtMSAvLyBhY2NvdW50OiBBZGRyZXNzCglhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKCXBvcAoJaW50YyAwIC8vIDAKCT4KCWR1cAoJYm56ICpza2lwX29yMwoJZnJhbWVfZGlnIC0yIC8vIGFtb3VudDogdWludDY0CglnbG9iYWwgTWluQmFsYW5jZQoJPj0KCXx8Cgoqc2tpcF9vcjM6CglyZXRzdWIKCi8vIHNhZmVSZWZ1bmQoYnV5ZXI6IEFkZHJlc3MsIGFtb3VudDogdWludDY0KTogdm9pZAovLwovLyBSZWZ1bmQgdGhhdCBjYW4gbmV2ZXIgZmFpbDogaWYgdGhlIGJ1eWVyIGNsb3NlZCB0aGVpciBhY2NvdW50IGFuZCB0aGUgYW1vdW50IGlzIHRvbyBzbWFsbAovLyB0byByZS1mdW5kIGl0LCB0aGUgYW1vdW50IGlzIGZvcmZlaXRlZCB0byBwcm9jZWVkcyBpbnN0ZWFkIG9mIGJsb2NraW5nIHRoZSBjYWxsLgpzYWZlUmVmdW5kOgoJcHJvdG8gMiAwCgoJLy8gKmlmMjBfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjY2NwoJLy8gdGhpcy5jYW5SZWNlaXZlKGJ1eWVyLCBhbW91bnQpCglmcmFtZV9kaWcgLTIgLy8gYW1vdW50OiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBidXllcjogQWRkcmVzcwoJY2FsbHN1YiBjYW5SZWNlaXZlCglieiAqaWYyMF9lbHNlCgoJLy8gKmlmMjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2NjgKCS8vIHNlbmRQYXltZW50KHsgcmVjZWl2ZXI6IGJ1eWVyLCBhbW91bnQ6IGFtb3VudCwgZmVlOiAwIH0pCglpdHhuX2JlZ2luCglpbnRjIDEgLy8gIHBheQoJaXR4bl9maWVsZCBUeXBlRW51bQoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjY4CgkvLyByZWNlaXZlcjogYnV5ZXIKCWZyYW1lX2RpZyAtMSAvLyBidXllcjogQWRkcmVzcwoJaXR4bl9maWVsZCBSZWNlaXZlcgoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjY4CgkvLyBhbW91bnQ6IGFtb3VudAoJZnJhbWVfZGlnIC0yIC8vIGFtb3VudDogdWludDY0CglpdHhuX2ZpZWxkIEFtb3VudAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6NjY4CgkvLyBmZWU6IDAKCWludGMgMCAvLyAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCWIgKmlmMjBfZW5kCgoqaWYyMF9lbHNlOgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2NzAKCS8vIHRoaXMucHJvY2VlZHMudmFsdWUgPSB0aGlzLnByb2NlZWRzLnZhbHVlICsgYW1vdW50CglieXRlYyA3IC8vICAicHJvY2VlZHMiCglkdXAKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTIgLy8gYW1vdW50OiB1aW50NjQKCSsKCWFwcF9nbG9iYWxfcHV0CgoqaWYyMF9lbmQ6CglyZXRzdWIKCi8vIGRvUmVsZWFzZSgpOiB2b2lkCmRvUmVsZWFzZToKCXByb3RvIDAgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlYyAwIC8vIDB4CgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2NzUKCS8vIGRpc3QgPSB0aGlzLmRpc3RyaWJ1dGlvbi52YWx1ZQoJYnl0ZWMgNiAvLyAgImRpc3RyaWJ1dGlvbiIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9idXJ5IDAgLy8gZGlzdDogYWRkcmVzcwoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2NzYKCS8vIGRpc3QuYXV0aEFkZHIgPT09IHRoaXMuYXBwLmFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIGRpc3Q6IGFkZHJlc3MKCWFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKCXBvcAoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CglieiAqaWYyMV9lbmQKCgkvLyAqaWYyMV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjY3NwoJLy8gc2VuZFBheW1lbnQoeyBzZW5kZXI6IGRpc3QsIHJlY2VpdmVyOiBkaXN0LCBhbW91bnQ6IDAsIHJla2V5VG86IGRpc3QsIGZlZTogMCB9KQoJaXR4bl9iZWdpbgoJaW50YyAxIC8vICBwYXkKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjY3NwoJLy8gc2VuZGVyOiBkaXN0CglmcmFtZV9kaWcgMCAvLyBkaXN0OiBhZGRyZXNzCglpdHhuX2ZpZWxkIFNlbmRlcgoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6Njc3CgkvLyByZWNlaXZlcjogZGlzdAoJZnJhbWVfZGlnIDAgLy8gZGlzdDogYWRkcmVzcwoJaXR4bl9maWVsZCBSZWNlaXZlcgoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6Njc3CgkvLyBhbW91bnQ6IDAKCWludGMgMCAvLyAwCglpdHhuX2ZpZWxkIEFtb3VudAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6Njc3CgkvLyByZWtleVRvOiBkaXN0CglmcmFtZV9kaWcgMCAvLyBkaXN0OiBhZGRyZXNzCglpdHhuX2ZpZWxkIFJla2V5VG8KCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjY3NwoJLy8gZmVlOiAwCglpbnRjIDAgLy8gMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CgoqaWYyMV9lbmQ6CgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjY3OQoJLy8gdGhpcy5zdGF0dXMudmFsdWUgPSBTVEFUVVNfUkVMRUFTRUQKCWJ5dGVjIDIgLy8gICJzdGF0dXMiCglpbnRjIDcgLy8gMwoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcV2VuUGFkU2FsZS5hbGdvLnRzOjY4MAoJLy8gdGhpcy5SZWxlYXNlZC5sb2coeyBzb2xkOiB0aGlzLnNvbGQudmFsdWUsIHJlbWFpbmluZzogdGhpcy5yZW1haW5pbmcudmFsdWUgfSkKCXB1c2hieXRlcyAweDA0ZWIwYmJjIC8vIFJlbGVhc2VkKHVpbnQ2NCx1aW50NjQpCglieXRlYyAxMCAvLyAgInNvbGQiCglhcHBfZ2xvYmFsX2dldAoJaXRvYgoJYnl0ZWMgMyAvLyAgInJlbWFpbmluZyIKCWFwcF9nbG9iYWxfZ2V0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2ODEKCS8vIHRoaXMuc3luY0ZhY3RvcnkoKQoJY2FsbHN1YiBzeW5jRmFjdG9yeQoJcmV0c3ViCgovLyBzeW5jRmFjdG9yeSgpOiB2b2lkCnN5bmNGYWN0b3J5OgoJcHJvdG8gMCAwCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2ODUKCS8vIHNlbmRNZXRob2RDYWxsPFt1aW50NjQsIHVpbnQ2NCwgdWludDY0LCB1aW50NjQsIHVpbnQ2NCwgdWludDY0XSwgdm9pZD4oewoJLy8gICAgICAgYXBwbGljYXRpb25JRDogdGhpcy5mYWN0b3J5LnZhbHVlLAoJLy8gICAgICAgbmFtZTogJ3N5bmNTYWxlJywKCS8vICAgICAgIG1ldGhvZEFyZ3M6IFsKCS8vICAgICAgICAgdGhpcy5zYWxlSWQudmFsdWUsCgkvLyAgICAgICAgIHRoaXMucHJpY2UudmFsdWUsCgkvLyAgICAgICAgIHRoaXMuZW5kUm91bmQudmFsdWUsCgkvLyAgICAgICAgIHRoaXMudG90YWwudmFsdWUsCgkvLyAgICAgICAgIHRoaXMuc29sZC52YWx1ZSwKCS8vICAgICAgICAgdGhpcy5zdGF0dXMudmFsdWUsCgkvLyAgICAgICBdLAoJLy8gICAgICAgZmVlOiAwLAoJLy8gICAgIH0pCglpdHhuX2JlZ2luCglpbnRjIDggLy8gIGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCXB1c2hieXRlcyAweDI3NjZjOGUyIC8vIG1ldGhvZCAic3luY1NhbGUodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2ODYKCS8vIGFwcGxpY2F0aW9uSUQ6IHRoaXMuZmFjdG9yeS52YWx1ZQoJYnl0ZWMgMTYgLy8gICJmYWN0b3J5IgoJYXBwX2dsb2JhbF9nZXQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0c1xXZW5QYWRTYWxlLmFsZ28udHM6Njg4CgkvLyBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgIHRoaXMuc2FsZUlkLnZhbHVlLAoJLy8gICAgICAgICB0aGlzLnByaWNlLnZhbHVlLAoJLy8gICAgICAgICB0aGlzLmVuZFJvdW5kLnZhbHVlLAoJLy8gICAgICAgICB0aGlzLnRvdGFsLnZhbHVlLAoJLy8gICAgICAgICB0aGlzLnNvbGQudmFsdWUsCgkvLyAgICAgICAgIHRoaXMuc3RhdHVzLnZhbHVlLAoJLy8gICAgICAgXQoJYnl0ZWMgMTUgLy8gICJzYWxlX2lkIgoJYXBwX2dsb2JhbF9nZXQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglieXRlYyAxMyAvLyAgInByaWNlIgoJYXBwX2dsb2JhbF9nZXQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglieXRlYyAxMiAvLyAgImVuZCIKCWFwcF9nbG9iYWxfZ2V0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJYnl0ZWMgMTggLy8gICJ0b3RhbCIKCWFwcF9nbG9iYWxfZ2V0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJYnl0ZWMgMTAgLy8gICJzb2xkIgoJYXBwX2dsb2JhbF9nZXQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglieXRlYyAyIC8vICAic3RhdHVzIgoJYXBwX2dsb2JhbF9nZXQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXFdlblBhZFNhbGUuYWxnby50czo2OTYKCS8vIGZlZTogMAoJaW50YyAwIC8vIDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJcmV0c3ViCgoqY3JlYXRlX05vT3A6CglwdXNoYnl0ZXMgMHhkZTNjOGI0NSAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoICphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb24KCgkvLyB0aGlzIGNvbnRyYWN0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgZ2l2ZW4gQUJJIG1ldGhvZCBmb3IgY3JlYXRlIE5vT3AKCWVycgoKKmNhbGxfTm9PcDoKCXB1c2hieXRlcyAweGNhYTQxZmY0IC8vIG1ldGhvZCAic2V0UGF5b3V0cyhieXRlW10pdm9pZCIKCXB1c2hieXRlcyAweGE5MmFjZWViIC8vIG1ldGhvZCAiYWRkSXRlbXMocGF5LGJ5dGVbXSl2b2lkIgoJcHVzaGJ5dGVzIDB4NTk3ZmM3YzAgLy8gbWV0aG9kICJyZWdpc3Rlcigpdm9pZCIKCXB1c2hieXRlcyAweDAxNzhmOTRiIC8vIG1ldGhvZCAicGF1c2UoKXZvaWQiCglwdXNoYnl0ZXMgMHgxYjUyOWRlOCAvLyBtZXRob2QgInVucGF1c2UoKXZvaWQiCglwdXNoYnl0ZXMgMHhhOGQyMDVhMiAvLyBtZXRob2QgInNldFByaWNlKHVpbnQ2NCl2b2lkIgoJcHVzaGJ5dGVzIDB4ZWQ4MWRlZWUgLy8gbWV0aG9kICJzZXRFbmRSb3VuZCh1aW50NjQpdm9pZCIKCXB1c2hieXRlcyAweGU3MmUyZTRmIC8vIG1ldGhvZCAiY29tbWl0KHBheSx1aW50NjQpdWludDY0IgoJcHVzaGJ5dGVzIDB4ZGVhMDg2YWQgLy8gbWV0aG9kICJyZXZlYWwodWludDY0KXZvaWQiCglwdXNoYnl0ZXMgMHhlMTg4NjhhNyAvLyBtZXRob2QgImNhbmNlbEV4cGlyZWQodWludDY0KXZvaWQiCglwdXNoYnl0ZXMgMHgwNzZiYmQ0ZCAvLyBtZXRob2QgInJlbGVhc2UoKXZvaWQiCglwdXNoYnl0ZXMgMHhkYmViZGQ4YiAvLyBtZXRob2QgIndpdGhkcmF3UHJvY2VlZHMoKXZvaWQiCglwdXNoYnl0ZXMgMHhmYmM1ZTllNiAvLyBtZXRob2QgImRlbGV0ZUl0ZW1QYWdlKHVpbnQ2NCl2b2lkIgoJcHVzaGJ5dGVzIDB4ODU0ZGVkZTAgLy8gbWV0aG9kICJvcFVwKCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9zZXRQYXlvdXRzICphYmlfcm91dGVfYWRkSXRlbXMgKmFiaV9yb3V0ZV9yZWdpc3RlciAqYWJpX3JvdXRlX3BhdXNlICphYmlfcm91dGVfdW5wYXVzZSAqYWJpX3JvdXRlX3NldFByaWNlICphYmlfcm91dGVfc2V0RW5kUm91bmQgKmFiaV9yb3V0ZV9jb21taXQgKmFiaV9yb3V0ZV9yZXZlYWwgKmFiaV9yb3V0ZV9jYW5jZWxFeHBpcmVkICphYmlfcm91dGVfcmVsZWFzZSAqYWJpX3JvdXRlX3dpdGhkcmF3UHJvY2VlZHMgKmFiaV9yb3V0ZV9kZWxldGVJdGVtUGFnZSAqYWJpX3JvdXRlX29wVXAKCgkvLyB0aGlzIGNvbnRyYWN0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgZ2l2ZW4gQUJJIG1ldGhvZCBmb3IgY2FsbCBOb09wCgllcnIKCipjYWxsX0RlbGV0ZUFwcGxpY2F0aW9uOgoJcHVzaGJ5dGVzIDB4MjQ4N2MzMmMgLy8gbWV0aG9kICJkZWxldGVBcHBsaWNhdGlvbigpdm9pZCIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoICphYmlfcm91dGVfZGVsZXRlQXBwbGljYXRpb24KCgkvLyB0aGlzIGNvbnRyYWN0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgZ2l2ZW4gQUJJIG1ldGhvZCBmb3IgY2FsbCBEZWxldGVBcHBsaWNhdGlvbgoJZXJy", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEw" } }