@akta/sdk 1.3.21-canary → 1.3.23-canary

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/chunk-LDPF6M2T.mjs +2285 -0
  2. package/dist/chunk-LDPF6M2T.mjs.map +1 -0
  3. package/dist/{chunk-QGWRGXS3.mjs → chunk-LFDLBNIG.mjs} +2 -2
  4. package/dist/chunk-PBSXCDLO.js +2285 -0
  5. package/dist/chunk-PBSXCDLO.js.map +1 -0
  6. package/dist/{chunk-3SKDWCEX.js → chunk-SPATQO4Y.js} +9 -9
  7. package/dist/{chunk-3SKDWCEX.js.map → chunk-SPATQO4Y.js.map} +1 -1
  8. package/dist/{chunk-7QSJ5YHV.js → chunk-U5BRJKPN.js} +83 -4
  9. package/dist/chunk-U5BRJKPN.js.map +1 -0
  10. package/dist/{chunk-BLFSBOWL.mjs → chunk-ZKTBPVTS.mjs} +90 -11
  11. package/dist/{chunk-BLFSBOWL.mjs.map → chunk-ZKTBPVTS.mjs.map} +1 -1
  12. package/dist/dao/index.js +3 -3
  13. package/dist/dao/index.mjs +2 -2
  14. package/dist/generated/AbstractedAccountUpdateStubClient.d.ts +569 -0
  15. package/dist/generated/PollClient.d.ts +272 -19
  16. package/dist/generated/PollFactoryClient.d.ts +85 -0
  17. package/dist/generated/SubscriptionsPluginClient.d.ts +87 -0
  18. package/dist/generated/WalletFactorySunsetContractClient.d.ts +1541 -0
  19. package/dist/index.js +4 -4
  20. package/dist/index.mjs +3 -3
  21. package/dist/poll/factory.d.ts +5 -1
  22. package/dist/poll/index.js +2 -2
  23. package/dist/poll/index.mjs +1 -1
  24. package/dist/poll/types.d.ts +3 -0
  25. package/dist/wallet/index.js +2 -2
  26. package/dist/wallet/index.mjs +1 -1
  27. package/dist/wallet/plugins/subscriptions.d.ts +6 -0
  28. package/package.json +2 -1
  29. package/dist/chunk-7QSJ5YHV.js.map +0 -1
  30. package/dist/chunk-SSRHC4FP.mjs +0 -2113
  31. package/dist/chunk-SSRHC4FP.mjs.map +0 -1
  32. package/dist/chunk-WGNJNLA2.js +0 -2113
  33. package/dist/chunk-WGNJNLA2.js.map +0 -1
  34. /package/dist/{chunk-QGWRGXS3.mjs.map → chunk-LFDLBNIG.mjs.map} +0 -0
@@ -0,0 +1,2285 @@
1
+ import {
2
+ makeErrorTranslator
3
+ } from "./chunk-2AEP6DTX.mjs";
4
+ import {
5
+ BaseSDK
6
+ } from "./chunk-JNYFBSSA.mjs";
7
+ import {
8
+ ENV_VAR_NAMES
9
+ } from "./chunk-X7YBMTJD.mjs";
10
+
11
+ // src/poll/index.ts
12
+ import { microAlgo as microAlgo2 } from "@algorandfoundation/algokit-utils";
13
+
14
+ // src/generated/PollClient.ts
15
+ import { ABIStructType, getStructValueFromTupleValue } from "@algorandfoundation/algokit-utils/abi";
16
+ import { AppClient as _AppClient } from "@algorandfoundation/algokit-utils/app-client";
17
+ import { AppFactory as _AppFactory } from "@algorandfoundation/algokit-utils/app-factory";
18
+ var APP_SPEC = { "name": "Poll", "structs": { "FunderInfo": [{ "name": "account", "type": "address" }, { "name": "amount", "type": "uint64" }] }, "methods": [{ "name": "create", "args": [{ "type": "uint64", "name": "akitaDAO" }, { "type": "uint8", "name": "type" }, { "type": "uint64", "name": "endTime" }, { "type": "uint64", "name": "maxSelected" }, { "type": "(address,uint64)", "struct": "FunderInfo", "name": "funder" }, { "type": "string", "name": "question" }, { "type": "string[]", "name": "options" }, { "type": "uint64", "name": "gateID" }], "returns": { "type": "void" }, "actions": { "create": ["NoOp"], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deleteBoxes", "args": [{ "type": "address[]", "name": "addresses" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deleteApplication", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["DeleteApplication"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "gatedVote", "args": [{ "type": "pay", "name": "mbrPayment" }, { "type": "appl", "name": "gateTxn" }, { "type": "uint64[]", "name": "votes" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "vote", "args": [{ "type": "pay", "name": "mbrPayment" }, { "type": "uint64[]", "name": "votes" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "hasVoted", "args": [{ "type": "address", "name": "user" }], "returns": { "type": "bool" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "updateAkitaDAO", "args": [{ "type": "uint64", "name": "akitaDAO" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "opUp", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 11, "bytes": 9 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "type": { "keyType": "AVMString", "valueType": "uint8", "key": "dHlwZQ==", "desc": "The type of poll: SingleChoice, MultipleChoice, SingleChoiceImpact or MultipleChoiceImpact" }, "gateID": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Z2F0ZV9pZA==", "desc": "the gate id to be used for filtering who can interact with this poll" }, "endTime": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZW5kX3RpbWU=", "desc": "the time the poll ends as a unix timestamp" }, "optionCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "b3B0aW9uX2NvdW50", "desc": "the number of options in the poll" }, "maxSelected": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bWF4X3NlbGVjdGVk", "desc": "the maximum number of selections in a multiple choice poll" }, "boxCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Ym94X2NvdW50", "desc": "the number of boxes created during the poll" }, "funder": { "keyType": "AVMString", "valueType": "FunderInfo", "key": "ZnVuZGVy", "desc": "the creator-side MBR funder to refund after the poll is deleted" }, "question": { "keyType": "AVMString", "valueType": "AVMString", "key": "cXVlc3Rpb24=", "desc": "the question being asked" }, "optionOne": { "keyType": "AVMString", "valueType": "AVMString", "key": "b3B0aW9uX29uZQ==", "desc": "the options and vote counts of the poll" }, "optionTwo": { "keyType": "AVMString", "valueType": "AVMString", "key": "b3B0aW9uX3R3bw==" }, "optionThree": { "keyType": "AVMString", "valueType": "AVMString", "key": "b3B0aW9uX3RocmVl" }, "optionFour": { "keyType": "AVMString", "valueType": "AVMString", "key": "b3B0aW9uX2ZvdXI=" }, "optionFive": { "keyType": "AVMString", "valueType": "AVMString", "key": "b3B0aW9uX2ZpdmU=" }, "votesOne": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90ZXNfb25l", "desc": "the number of votes for each option" }, "votesTwo": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90ZXNfdHdv" }, "votesThree": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90ZXNfdGhyZWU=" }, "votesFour": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90ZXNfZm91cg==" }, "votesFive": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90ZXNfZml2ZQ==" }, "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVyc2lvbg==", "desc": "the current version of the contract" }, "akitaDAO": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWtpdGFfZGFv", "desc": "the app ID of the Akita DAO" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "votes": { "keyType": "address", "valueType": "AVMBytes", "desc": "A map of addresses to empty bytes to track who has voted", "prefix": "" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [1609], "errorMessage": "Bytes has valid prefix" }, { "pc": [1141, 1366], "errorMessage": "ERR:AVOT" }, { "pc": [505], "errorMessage": "ERR:BDEP" }, { "pc": [1267], "errorMessage": "ERR:FGTE" }, { "pc": [1405], "errorMessage": "ERR:HGTE" }, { "pc": [525], "errorMessage": "ERR:IETM" }, { "pc": [672], "errorMessage": "ERR:IMXS" }, { "pc": [621], "errorMessage": "ERR:IOPC" }, { "pc": [1281, 1295, 1419, 1433], "errorMessage": "ERR:IPAY" }, { "pc": [546], "errorMessage": "ERR:IPTY" }, { "pc": [1654, 1816], "errorMessage": "ERR:IVCT" }, { "pc": [1676, 1858, 1893], "errorMessage": "ERR:IVOP" }, { "pc": [1160, 1385], "errorMessage": "ERR:IVOT" }, { "pc": [1036], "errorMessage": "ERR:MCFF" }, { "pc": [1516], "errorMessage": "ERR:NDAO" }, { "pc": [949], "errorMessage": "ERR:NVOT" }, { "pc": [904, 1051], "errorMessage": "ERR:PACT" }, { "pc": [1129, 1354], "errorMessage": "ERR:PEND" }, { "pc": [1070], "errorMessage": "ERR:SHVB" }, { "pc": [1500], "errorMessage": "application exists" }, { "pc": [896, 1e3, 1043, 1055, 1121, 1165, 1177, 1346, 1390, 1487, 1537, 1549, 1561, 1622, 1634, 1666, 1685, 1700, 1721, 1741, 1763, 1786, 1808, 1848, 1911, 1935, 1955, 1977, 2e3], "errorMessage": "check GlobalState exists" }, { "pc": [928], "errorMessage": "index access is out of bounds" }, { "pc": [690, 721, 754, 793, 832], "errorMessage": "index out of bounds" }, { "pc": [443], "errorMessage": "invalid array encoding" }, { "pc": [396, 413, 457, 877, 1103, 1328, 1645, 1800], "errorMessage": "invalid array length header" }, { "pc": [889], "errorMessage": "invalid number of bytes for arc4.dynamic_array<account>" }, { "pc": [403], "errorMessage": "invalid number of bytes for arc4.dynamic_array<arc4.uint8>" }, { "pc": [477], "errorMessage": "invalid number of bytes for arc4.dynamic_array<string>" }, { "pc": [1114, 1339], "errorMessage": "invalid number of bytes for arc4.dynamic_array<uint64>" }, { "pc": [1454], "errorMessage": "invalid number of bytes for arc4.static_array<arc4.uint8, 32>" }, { "pc": [354, 371, 380, 485, 1479], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [363], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [390], "errorMessage": "invalid number of bytes for smart_contracts/utils/types/mbr.ts::FunderInfo" }, { "pc": [1614], "errorMessage": "invalid number of bytes for uint64" }, { "pc": [451], "errorMessage": "invalid tail pointer for (len+(len+utf8[])[])" }, { "pc": [1096], "errorMessage": "transaction type is appl" }, { "pc": [1085, 1321], "errorMessage": "transaction type is pay" }], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDIgOCAxNTMwMAogICAgYnl0ZWNibG9jayAiYm94X2NvdW50IiAidm90ZXNfb25lIiAidm90ZXNfdHdvIiAidm90ZXNfdGhyZWUiICJ2b3Rlc19mb3VyIiAidm90ZXNfZml2ZSIgImFraXRhX2RhbyIgInR5cGUiICJlbmRfdGltZSIgIkVSUjpJUEFZIiAiZ2F0ZV9pZCIgIm9wdGlvbl9jb3VudCIgIkVSUjpJVk9QIiAibWF4X3NlbGVjdGVkIiAiRVJSOlBBQ1QiICJFUlI6UEVORCIgIkVSUjpBVk9UIiAiRVJSOklWT1QiIDB4MTUxZjdjNzUgIkVSUjpJVkNUIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo4NwogICAgLy8gdm90ZXNPbmUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVZvdGVzT25lIH0pCiAgICBieXRlY18xIC8vICJ2b3Rlc19vbmUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODgKICAgIC8vIHZvdGVzVHdvID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc1R3byB9KQogICAgYnl0ZWNfMiAvLyAidm90ZXNfdHdvIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyB2b3Rlc1RocmVlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc1RocmVlIH0pCiAgICBieXRlY18zIC8vICJ2b3Rlc190aHJlZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo5MAogICAgLy8gdm90ZXNGb3VyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc0ZvdXIgfSkKICAgIGJ5dGVjIDQgLy8gInZvdGVzX2ZvdXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTEKICAgIC8vIHZvdGVzRml2ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNGaXZlIH0pCiAgICBieXRlYyA1IC8vICJ2b3Rlc19maXZlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjAKICAgIC8vIGV4cG9ydCBjbGFzcyBQb2xsIGV4dGVuZHMgQWtpdGFCYXNlQ29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4MjQ4N2MzMmMgLy8gbWV0aG9kICJkZWxldGVBcHBsaWNhdGlvbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fZGVsZXRlQXBwbGljYXRpb25fcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjYwCiAgICAvLyBleHBvcnQgY2xhc3MgUG9sbCBleHRlbmRzIEFraXRhQmFzZUNvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMTQKICAgIHB1c2hieXRlc3MgMHhlMTQxOTA4MCAweDViY2Y5MTAwIDB4ZGQzMDljN2IgMHg1YTdmNDkzMiAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgLy8gbWV0aG9kICJkZWxldGVCb3hlcyhhZGRyZXNzW10pdm9pZCIsIG1ldGhvZCAiZ2F0ZWRWb3RlKHBheSxhcHBsLHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgInZvdGUocGF5LHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImhhc1ZvdGVkKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAidXBkYXRlQWtpdGFEQU8odWludDY0KXZvaWQiLCBtZXRob2QgIm9wVXAoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBkZWxldGVCb3hlcyBnYXRlZFZvdGUgdm90ZSBoYXNWb3RlZCB1cGRhdGVBa2l0YURBTyBtYWluX29wVXBfcm91dGVAMTIKICAgIGVycgoKbWFpbl9vcFVwX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDEKICAgIC8vIG9wVXAoKTogdm9pZCB7IH0KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjYwCiAgICAvLyBleHBvcnQgY2xhc3MgUG9sbCBleHRlbmRzIEFraXRhQmFzZUNvbnRyYWN0IHsKICAgIHB1c2hieXRlcyAweDk1YWFmNWViIC8vIG1ldGhvZCAiY3JlYXRlKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LChhZGRyZXNzLHVpbnQ2NCksc3RyaW5nLHN0cmluZ1tdLHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCm1haW5fZGVsZXRlQXBwbGljYXRpb25fcm91dGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjE4CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBkZWxldGVBcHBsaWNhdGlvbgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVhZF9ieXRlX2xlbmd0aF9lbGVtZW50KGFycmF5OiBieXRlcywgaW5kZXg6IHVpbnQ2NCkgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcmVhZF9ieXRlX2xlbmd0aF9lbGVtZW50OgogICAgcHJvdG8gMiAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OlBvbGwuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9tYnIudHM6OkZ1bmRlckluZm8KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgpjcmVhdGVfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBkdXAKICAgIGRpZyA1CiAgICA8CiAgICBieiBjcmVhdGVfYWZ0ZXJfZm9yQDQKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBmb3IgKGxlbisobGVuK3V0ZjhbXSlbXSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNyZWF0ZV9mb3JfaGVhZGVyQDEKCmNyZWF0ZV9hZnRlcl9mb3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTUwCiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHN0cmluZz4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTYxCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQgIT09IDAsIEVSUl9CQURfREVQTE9ZRVIpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25JRAogICAgYm56IGNyZWF0ZV9hZnRlcl9hc3NlcnRANwogICAgcHVzaGJ5dGVzICJFUlI6QkRFUCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpCREVQCgpjcmVhdGVfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gbG9nZ2VkQXNzZXJ0KEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPCBlbmRUaW1lLCBFUlJfSU5WQUxJRF9FTkRfVElNRSkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAxMAogICAgPAogICAgYm56IGNyZWF0ZV9hZnRlcl9hc3NlcnRAOQogICAgcHVzaGJ5dGVzICJFUlI6SUVUTSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJRVRNCgpjcmVhdGVfYWZ0ZXJfYXNzZXJ0QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE2MwogICAgLy8gbG9nZ2VkQXNzZXJ0KHR5cGUuYXNVaW50NjQoKSA8IE11bHRpcGxlQ2hvaWNlSW1wYWN0LmFzVWludDY0KCksIEVSUl9JTlZBTElEX1BPTExfVFlQRSkKICAgIGRpZyAxMAogICAgYnRvaQogICAgcHVzaGludCA0MAogICAgPAogICAgYm56IGNyZWF0ZV9hZnRlcl9hc3NlcnRAMTEKICAgIHB1c2hieXRlcyAiRVJSOklQVFkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBUWQoKY3JlYXRlX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWMgNiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxNjUKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBBcHBsaWNhdGlvbihha2l0YURBTykKICAgIGRpZyAxMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxVaW50OD4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVR5cGUgfSkKICAgIGJ5dGVjIDcgLy8gInR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gdGhpcy50eXBlLnZhbHVlID0gdHlwZQogICAgZGlnIDExCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo2NwogICAgLy8gZ2F0ZUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5R2F0ZUlEIH0pCiAgICBieXRlYyAxMCAvLyAiZ2F0ZV9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTY3CiAgICAvLyB0aGlzLmdhdGVJRC52YWx1ZSA9IGdhdGVJRAogICAgZGlnIDEzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZW5kVGltZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleUVuZFRpbWUgfSkKICAgIGJ5dGVjIDggLy8gImVuZF90aW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxNjgKICAgIC8vIHRoaXMuZW5kVGltZS52YWx1ZSA9IGVuZFRpbWUKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NzcKICAgIC8vIGZ1bmRlciA9IEdsb2JhbFN0YXRlPEZ1bmRlckluZm8+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUZ1bmRlciB9KQogICAgcHVzaGJ5dGVzICJmdW5kZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE2OQogICAgLy8gdGhpcy5mdW5kZXIudmFsdWUgPSBjbG9uZShmdW5kZXIpCiAgICBkaWcgOAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NzkKICAgIC8vIHF1ZXN0aW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5UXVlc3Rpb24gfSkKICAgIHB1c2hieXRlcyAicXVlc3Rpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gdGhpcy5xdWVzdGlvbi52YWx1ZSA9IHF1ZXN0aW9uCiAgICBkaWcgNwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBsb2dnZWRBc3NlcnQob3B0aW9ucy5sZW5ndGggPj0gMiAmJiBvcHRpb25zLmxlbmd0aCA8PSA1LCBFUlJfSU5WQUxJRF9PUFRJT05fQ09VTlQpCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgID49CiAgICBieiBjcmVhdGVfYm9vbF9mYWxzZUAxNAogICAgZGlnIDQKICAgIHB1c2hpbnQgNQogICAgPD0KICAgIGJ6IGNyZWF0ZV9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKY3JlYXRlX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE3MgogICAgLy8gbG9nZ2VkQXNzZXJ0KG9wdGlvbnMubGVuZ3RoID49IDIgJiYgb3B0aW9ucy5sZW5ndGggPD0gNSwgRVJSX0lOVkFMSURfT1BUSU9OX0NPVU5UKQogICAgYm56IGNyZWF0ZV9hZnRlcl9hc3NlcnRAMTcKICAgIHB1c2hieXRlcyAiRVJSOklPUEMiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SU9QQwoKY3JlYXRlX2FmdGVyX2Fzc2VydEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBpZiAodHlwZSA9PT0gTXVsdGlwbGVDaG9pY2UgfHwgdHlwZSA9PT0gTXVsdGlwbGVDaG9pY2VJbXBhY3QpIHsKICAgIGRpZyAxMAogICAgcHVzaGJ5dGVzIDB4MTQKICAgID09CiAgICBibnogY3JlYXRlX2lmX2JvZHlAMTkKICAgIGRpZyAxMAogICAgcHVzaGJ5dGVzIDB4MjgKICAgID09CiAgICBieiBjcmVhdGVfYWZ0ZXJfaWZfZWxzZUAyNgoKY3JlYXRlX2lmX2JvZHlAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE3NQogICAgLy8gbG9nZ2VkQXNzZXJ0KG1heFNlbGVjdGVkID49IDIgJiYgbWF4U2VsZWN0ZWQgPD0gb3B0aW9ucy5sZW5ndGggLSAxLCBFUlJfSU5WQUxJRF9NQVhfU0VMRUNUSU9OKQogICAgZGlnIDgKICAgIGludGNfMiAvLyAyCiAgICA+PQogICAgYnogY3JlYXRlX2Jvb2xfZmFsc2VAMjIKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDkKICAgID49CiAgICBieiBjcmVhdGVfYm9vbF9mYWxzZUAyMgogICAgaW50Y18xIC8vIDEKCmNyZWF0ZV9ib29sX21lcmdlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxNzUKICAgIC8vIGxvZ2dlZEFzc2VydChtYXhTZWxlY3RlZCA+PSAyICYmIG1heFNlbGVjdGVkIDw9IG9wdGlvbnMubGVuZ3RoIC0gMSwgRVJSX0lOVkFMSURfTUFYX1NFTEVDVElPTikKICAgIGJueiBjcmVhdGVfYWZ0ZXJfYXNzZXJ0QDI1CiAgICBwdXNoYnl0ZXMgIkVSUjpJTVhTIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklNWFMKCmNyZWF0ZV9hZnRlcl9hc3NlcnRAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjczCiAgICAvLyBtYXhTZWxlY3RlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleU1heFNlbGVjdGVkIH0pCiAgICBieXRlYyAxMyAvLyAibWF4X3NlbGVjdGVkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxNzYKICAgIC8vIHRoaXMubWF4U2VsZWN0ZWQudmFsdWUgPSBtYXhTZWxlY3RlZAogICAgZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CgpjcmVhdGVfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NzEKICAgIC8vIG9wdGlvbkNvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5T3B0aW9uQ291bnQgfSkKICAgIGJ5dGVjIDExIC8vICJvcHRpb25fY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE3OQogICAgLy8gdGhpcy5vcHRpb25Db3VudC52YWx1ZSA9IG9wdGlvbnMubGVuZ3RoCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gYm94Q291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlCb3hDb3VudCB9KQogICAgYnl0ZWNfMCAvLyAiYm94X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxODAKICAgIC8vIHRoaXMuYm94Q291bnQudmFsdWUgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyB0aGlzLm9wdGlvbk9uZS52YWx1ZSA9IG9wdGlvbnNbMF0KICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVhZF9ieXRlX2xlbmd0aF9lbGVtZW50CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo4MQogICAgLy8gb3B0aW9uT25lID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5T3B0aW9uT25lIH0pCiAgICBwdXNoYnl0ZXMgIm9wdGlvbl9vbmUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE4MgogICAgLy8gdGhpcy5vcHRpb25PbmUudmFsdWUgPSBvcHRpb25zWzBdCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxODMKICAgIC8vIHRoaXMub3B0aW9uVHdvLnZhbHVlID0gb3B0aW9uc1sxXQogICAgaW50Y18xIC8vIDEKICAgIGRpZyAxCiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxODMKICAgIC8vIHRoaXMub3B0aW9uVHdvLnZhbHVlID0gb3B0aW9uc1sxXQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZWFkX2J5dGVfbGVuZ3RoX2VsZW1lbnQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjgyCiAgICAvLyBvcHRpb25Ud28gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlPcHRpb25Ud28gfSkKICAgIHB1c2hieXRlcyAib3B0aW9uX3R3byIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTgzCiAgICAvLyB0aGlzLm9wdGlvblR3by52YWx1ZSA9IG9wdGlvbnNbMV0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gaWYgKG9wdGlvbnMubGVuZ3RoID49IDMpIHsKICAgIHB1c2hpbnQgMwogICAgPj0KICAgIGJ6IGNyZWF0ZV9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE4NgogICAgLy8gdGhpcy5vcHRpb25UaHJlZS52YWx1ZSA9IG9wdGlvbnNbMl0KICAgIGludGNfMiAvLyAyCiAgICBkaWcgNQogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTg2CiAgICAvLyB0aGlzLm9wdGlvblRocmVlLnZhbHVlID0gb3B0aW9uc1syXQogICAgZGlnIDUKICAgIGludGNfMiAvLyAyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVhZF9ieXRlX2xlbmd0aF9lbGVtZW50CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo4MwogICAgLy8gb3B0aW9uVGhyZWUgPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlPcHRpb25UaHJlZSB9KQogICAgcHVzaGJ5dGVzICJvcHRpb25fdGhyZWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE4NgogICAgLy8gdGhpcy5vcHRpb25UaHJlZS52YWx1ZSA9IG9wdGlvbnNbMl0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjcmVhdGVfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTg5CiAgICAvLyBpZiAob3B0aW9ucy5sZW5ndGggPj0gNCkgewogICAgZGlnIDQKICAgIHB1c2hpbnQgNAogICAgPj0KICAgIGJ6IGNyZWF0ZV9hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5vcHRpb25Gb3VyLnZhbHVlID0gb3B0aW9uc1szXQogICAgcHVzaGludCAzCiAgICBkaWcgNQogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLm9wdGlvbkZvdXIudmFsdWUgPSBvcHRpb25zWzNdCiAgICBkaWcgNQogICAgcHVzaGludCAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVhZF9ieXRlX2xlbmd0aF9lbGVtZW50CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gb3B0aW9uRm91ciA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleU9wdGlvbkZvdXIgfSkKICAgIHB1c2hieXRlcyAib3B0aW9uX2ZvdXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5vcHRpb25Gb3VyLnZhbHVlID0gb3B0aW9uc1szXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNyZWF0ZV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxOTMKICAgIC8vIGlmIChvcHRpb25zLmxlbmd0aCA+PSA1KSB7CiAgICBkaWcgNAogICAgcHVzaGludCA1CiAgICA+PQogICAgYnogY3JlYXRlX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLm9wdGlvbkZpdmUudmFsdWUgPSBvcHRpb25zWzRdCiAgICBwdXNoaW50IDQKICAgIGRpZyA1CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMub3B0aW9uRml2ZS52YWx1ZSA9IG9wdGlvbnNbNF0KICAgIGRpZyA1CiAgICBwdXNoaW50IDQKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZWFkX2J5dGVfbGVuZ3RoX2VsZW1lbnQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg1CiAgICAvLyBvcHRpb25GaXZlID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5T3B0aW9uRml2ZSB9KQogICAgcHVzaGJ5dGVzICJvcHRpb25fZml2ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLm9wdGlvbkZpdmUudmFsdWUgPSBvcHRpb25zWzRdCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY3JlYXRlX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNyZWF0ZV9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlX2Jvb2xfbWVyZ2VAMjMKCmNyZWF0ZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlX2Jvb2xfbWVyZ2VAMTUKCgovLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjpQb2xsLmRlbGV0ZUJveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlQm94ZXM6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE5OAogICAgLy8gZGVsZXRlQm94ZXMoYWRkcmVzc2VzOiBBY2NvdW50W10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCAzMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFjY291bnQ+CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE5OQogICAgLy8gbG9nZ2VkQXNzZXJ0KEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPiB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0FDVElWRSkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjY5CiAgICAvLyBlbmRUaW1lID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5RW5kVGltZSB9KQogICAgYnl0ZWMgOCAvLyAiZW5kX3RpbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE5OQogICAgLy8gbG9nZ2VkQXNzZXJ0KEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPiB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0FDVElWRSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA+CiAgICBibnogZGVsZXRlQm94ZXNfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDE0IC8vICJFUlI6UEFDVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpQQUNUCgpkZWxldGVCb3hlc19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjAxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAzCgpkZWxldGVCb3hlc193aGlsZV90b3BANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjAxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgMgogICAgZGlnIDEKICAgIDwKICAgIGJ6IGRlbGV0ZUJveGVzX2FmdGVyX3doaWxlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjAzCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy52b3RlcyhhZGRyZXNzZXNbaV0pLmV4aXN0cywgRVJSX05PVF9WT1RFRCkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDMKICAgIHB1c2hpbnQgMzIKICAgICoKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDUKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGRlbGV0ZUJveGVzX2FmdGVyX2Fzc2VydEA3CiAgICBwdXNoYnl0ZXMgIkVSUjpOVk9UIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5WT1QKCmRlbGV0ZUJveGVzX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMDQKICAgIC8vIHRoaXMudm90ZXMoYWRkcmVzc2VzW2ldKS5kZWxldGUoKQogICAgZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIwNi0yMTIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBhZGRyZXNzZXNbaV0sCiAgICAvLyAgICAgYW1vdW50OiB2b3Rlc01CUiwKICAgIC8vICAgICBub3RlOiAnTUJSIHJlZnVuZCBmb3IgcG9sbCB2b3RlJywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIxMAogICAgLy8gbm90ZTogJ01CUiByZWZ1bmQgZm9yIHBvbGwgdm90ZScsCiAgICBwdXNoYnl0ZXMgIk1CUiByZWZ1bmQgZm9yIHBvbGwgdm90ZSIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMDkKICAgIC8vIGFtb3VudDogdm90ZXNNQlIsCiAgICBpbnRjIDQgLy8gMTUzMDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIwNi0yMTEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBhZGRyZXNzZXNbaV0sCiAgICAvLyAgICAgYW1vdW50OiB2b3Rlc01CUiwKICAgIC8vICAgICBub3RlOiAnTUJSIHJlZnVuZCBmb3IgcG9sbCB2b3RlJywKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjA2LTIxMgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGFkZHJlc3Nlc1tpXSwKICAgIC8vICAgICBhbW91bnQ6IHZvdGVzTUJSLAogICAgLy8gICAgIG5vdGU6ICdNQlIgcmVmdW5kIGZvciBwb2xsIHZvdGUnLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gdGhpcy5ib3hDb3VudC52YWx1ZSAtPSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gYm94Q291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlCb3hDb3VudCB9KQogICAgYnl0ZWNfMCAvLyAiYm94X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIHRoaXMuYm94Q291bnQudmFsdWUgLT0gMQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBib3hDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleUJveENvdW50IH0pCiAgICBieXRlY18wIC8vICJib3hfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gdGhpcy5ib3hDb3VudC52YWx1ZSAtPSAxCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMDEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhZGRyZXNzZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAzCiAgICBiIGRlbGV0ZUJveGVzX3doaWxlX3RvcEA0CgpkZWxldGVCb3hlc19hZnRlcl93aGlsZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxOTgKICAgIC8vIGRlbGV0ZUJveGVzKGFkZHJlc3NlczogQWNjb3VudFtdKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo6UG9sbC5kZWxldGVBcHBsaWNhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZUFwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMjAKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MsIEVSUl9NVVNUX0JFX0NBTExFRF9GUk9NX0ZBQ1RPUlkpCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBibnogZGVsZXRlQXBwbGljYXRpb25fYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOk1DRkYiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TUNGRgoKZGVsZXRlQXBwbGljYXRpb25fYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIyMQogICAgLy8gbG9nZ2VkQXNzZXJ0KEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPiB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0FDVElWRSkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjY5CiAgICAvLyBlbmRUaW1lID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5RW5kVGltZSB9KQogICAgYnl0ZWMgOCAvLyAiZW5kX3RpbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIyMQogICAgLy8gbG9nZ2VkQXNzZXJ0KEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPiB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0FDVElWRSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA+CiAgICBibnogZGVsZXRlQXBwbGljYXRpb25fYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDE0IC8vICJFUlI6UEFDVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpQQUNUCgpkZWxldGVBcHBsaWNhdGlvbl9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5ib3hDb3VudC52YWx1ZSA9PT0gMCwgRVJSX1NUSUxMX0hBU19WT1RFX0JPWEVTKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NzUKICAgIC8vIGJveENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Qm94Q291bnQgfSkKICAgIGJ5dGVjXzAgLy8gImJveF9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5ib3hDb3VudC52YWx1ZSA9PT0gMCwgRVJSX1NUSUxMX0hBU19WT1RFX0JPWEVTKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IGRlbGV0ZUFwcGxpY2F0aW9uX2FmdGVyX2Fzc2VydEA3CiAgICBwdXNoYnl0ZXMgIkVSUjpTSFZCIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlNIVkIKCmRlbGV0ZUFwcGxpY2F0aW9uX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMTgKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdEZWxldGVBcHBsaWNhdGlvbicgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjpQb2xsLmdhdGVkVm90ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdhdGVkVm90ZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjI3LTIzMQogICAgLy8gZ2F0ZWRWb3RlKAogICAgLy8gICBtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGdhdGVUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLAogICAgLy8gICB2b3RlczogdWludDY0W10KICAgIC8vICk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjMyCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8PSB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0VOREVEKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGVuZFRpbWUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlFbmRUaW1lIH0pCiAgICBieXRlYyA4IC8vICJlbmRfdGltZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjMyCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8PSB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0VOREVEKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIDw9CiAgICBibnogZ2F0ZWRWb3RlX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyAxNSAvLyAiRVJSOlBFTkQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6UEVORAoKZ2F0ZWRWb3RlX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMzMKICAgIC8vIGxvZ2dlZEFzc2VydCghdGhpcy52b3RlcyhUeG4uc2VuZGVyKS5leGlzdHMsIEVSUl9BTFJFQURZX1ZPVEVEKQogICAgdHhuIFNlbmRlcgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnYXRlZFZvdGVfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDE2IC8vICJFUlI6QVZPVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpBVk9UCgpnYXRlZFZvdGVfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIzNAogICAgLy8gbG9nZ2VkQXNzZXJ0KHZvdGVzLmxlbmd0aCA8PSA1ICYmIHZvdGVzLmxlbmd0aCA+PSAxLCBFUlJfSU5WQUxJRF9WT1RFKQogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDw9CiAgICBieiBnYXRlZFZvdGVfYm9vbF9mYWxzZUA4CiAgICBkdXAKICAgIGJ6IGdhdGVkVm90ZV9ib29sX2ZhbHNlQDgKICAgIGludGNfMSAvLyAxCgpnYXRlZFZvdGVfYm9vbF9tZXJnZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMzQKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlcy5sZW5ndGggPD0gNSAmJiB2b3Rlcy5sZW5ndGggPj0gMSwgRVJSX0lOVkFMSURfVk9URSkKICAgIGJueiBnYXRlZFZvdGVfYWZ0ZXJfYXNzZXJ0QDExCiAgICBieXRlYyAxNyAvLyAiRVJSOklWT1QiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVZPVAoKZ2F0ZWRWb3RlX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBsb2dnZWRBc3NlcnQoZ2F0ZUNoZWNrKGdhdGVUeG4sIHRoaXMuYWtpdGFEQU8udmFsdWUsIFR4bi5zZW5kZXIsIHRoaXMuZ2F0ZUlELnZhbHVlKSwgRVJSX0ZBSUxFRF9HQVRFKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWMgNiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMzUKICAgIC8vIGxvZ2dlZEFzc2VydChnYXRlQ2hlY2soZ2F0ZVR4biwgdGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlciwgdGhpcy5nYXRlSUQudmFsdWUpLCBFUlJfRkFJTEVEX0dBVEUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdHhuIFNlbmRlcgogICAgYnVyeSA3CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo2NwogICAgLy8gZ2F0ZUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5R2F0ZUlEIH0pCiAgICBieXRlYyAxMCAvLyAiZ2F0ZV9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBsb2dnZWRBc3NlcnQoZ2F0ZUNoZWNrKGdhdGVUeG4sIHRoaXMuYWtpdGFEQU8udmFsdWUsIFR4bi5zZW5kZXIsIHRoaXMuZ2F0ZUlELnZhbHVlKSwgRVJSX0ZBSUxFRF9HQVRFKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgNwogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIGRpZyAzCiAgICBndHhucyBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzCiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNAogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgYnogZ2F0ZWRWb3RlX2Jvb2xfZmFsc2VAMjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM0CiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICBkaWcgMgogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzQKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIGJueiBnYXRlZFZvdGVfYm9vbF9mYWxzZUAyNQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzUKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgZGlnIDIKICAgIGd0eG5zIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNQogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgLy8gZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICBieiBnYXRlZFZvdGVfYm9vbF9mYWxzZUAyNQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4NDM5MjI2NTUgLy8gbWV0aG9kICJtdXN0Q2hlY2soYWRkcmVzcyx1aW50NjQsYnl0ZVtdW10pdm9pZCIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzYKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICBieiBnYXRlZFZvdGVfYm9vbF9mYWxzZUAyNQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzcKICAgIC8vIGdhdGVUeG4uYXBwQXJncygxKSA9PT0gbmV3IEFkZHJlc3MoY2FsbGVyKS5ieXRlcyAmJgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDYKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzcKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIGJ6IGdhdGVkVm90ZV9ib29sX2ZhbHNlQDI1CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzOAogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDIpID09PSBpdG9iKGlkKQogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDUKICAgIGl0b2IKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzgKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygyKSA9PT0gaXRvYihpZCkKICAgIGJ6IGdhdGVkVm90ZV9ib29sX2ZhbHNlQDI1CiAgICBpbnRjXzEgLy8gMQoKZ2F0ZWRWb3RlX2Jvb2xfbWVyZ2VAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIzNQogICAgLy8gbG9nZ2VkQXNzZXJ0KGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBUeG4uc2VuZGVyLCB0aGlzLmdhdGVJRC52YWx1ZSksIEVSUl9GQUlMRURfR0FURSkKICAgIGJueiBnYXRlZFZvdGVfYWZ0ZXJfYXNzZXJ0QDEzCiAgICBwdXNoYnl0ZXMgIkVSUjpGR1RFIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkZHVEUKCmdhdGVkVm90ZV9hZnRlcl9hc3NlcnRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gbG9nZ2VkQXNzZXJ0KG1iclBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBnYXRlZFZvdGVfYWZ0ZXJfYXNzZXJ0QDE1CiAgICBieXRlYyA5IC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpnYXRlZFZvdGVfYWZ0ZXJfYXNzZXJ0QDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMzcKICAgIC8vIGxvZ2dlZEFzc2VydChtYnJQYXltZW50LmFtb3VudCA9PT0gdm90ZXNNQlIsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMwogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjIDQgLy8gMTUzMDAKICAgID09CiAgICBibnogZ2F0ZWRWb3RlX2FmdGVyX2Fzc2VydEAxNwogICAgYnl0ZWMgOSAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKZ2F0ZWRWb3RlX2FmdGVyX2Fzc2VydEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjM5CiAgICAvLyB0aGlzLmNyZWF0ZVZvdGUodm90ZXMpCiAgICBkaWcgMQogICAgY2FsbHN1YiBjcmVhdGVWb3RlCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjI3LTIzMQogICAgLy8gZ2F0ZWRWb3RlKAogICAgLy8gICBtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGdhdGVUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLAogICAgLy8gICB2b3RlczogdWludDY0W10KICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2F0ZWRWb3RlX2Jvb2xfZmFsc2VAMjU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnYXRlZFZvdGVfYm9vbF9tZXJnZUAyNgoKZ2F0ZWRWb3RlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGdhdGVkVm90ZV9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjpQb2xsLnZvdGVbcm91dGluZ10oKSAtPiB2b2lkOgp2b3RlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIHZvdGUobWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCB2b3RlczogdWludDY0W10pOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8PSB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0VOREVEKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGVuZFRpbWUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlFbmRUaW1lIH0pCiAgICBieXRlYyA4IC8vICJlbmRfdGltZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8PSB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0VOREVEKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIDw9CiAgICBibnogdm90ZV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMTUgLy8gIkVSUjpQRU5EIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlBFTkQKCnZvdGVfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gbG9nZ2VkQXNzZXJ0KCF0aGlzLnZvdGVzKFR4bi5zZW5kZXIpLmV4aXN0cywgRVJSX0FMUkVBRFlfVk9URUQpCiAgICB0eG4gU2VuZGVyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHZvdGVfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDE2IC8vICJFUlI6QVZPVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpBVk9UCgp2b3RlX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNDUKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlcy5sZW5ndGggPD0gNSAmJiB2b3Rlcy5sZW5ndGggPj0gMSwgRVJSX0lOVkFMSURfVk9URSkKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA8PQogICAgYnogdm90ZV9ib29sX2ZhbHNlQDgKICAgIGR1cAogICAgYnogdm90ZV9ib29sX2ZhbHNlQDgKICAgIGludGNfMSAvLyAxCgp2b3RlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjQ1CiAgICAvLyBsb2dnZWRBc3NlcnQodm90ZXMubGVuZ3RoIDw9IDUgJiYgdm90ZXMubGVuZ3RoID49IDEsIEVSUl9JTlZBTElEX1ZPVEUpCiAgICBibnogdm90ZV9hZnRlcl9hc3NlcnRAMTEKICAgIGJ5dGVjIDE3IC8vICJFUlI6SVZPVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJVk9UCgp2b3RlX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjQ2CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5nYXRlSUQudmFsdWUgPT09IDAsIEVSUl9IQVNfR0FURSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjY3CiAgICAvLyBnYXRlSUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlHYXRlSUQgfSkKICAgIGJ5dGVjIDEwIC8vICJnYXRlX2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNDYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmdhdGVJRC52YWx1ZSA9PT0gMCwgRVJSX0hBU19HQVRFKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IHZvdGVfYWZ0ZXJfYXNzZXJ0QDEzCiAgICBwdXNoYnl0ZXMgIkVSUjpIR1RFIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkhHVEUKCnZvdGVfYWZ0ZXJfYXNzZXJ0QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNDcKICAgIC8vIGxvZ2dlZEFzc2VydChtYnJQYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyAyCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogdm90ZV9hZnRlcl9hc3NlcnRAMTUKICAgIGJ5dGVjIDkgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCnZvdGVfYWZ0ZXJfYXNzZXJ0QDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNDgKICAgIC8vIGxvZ2dlZEFzc2VydChtYnJQYXltZW50LmFtb3VudCA9PT0gdm90ZXNNQlIsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMgogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjIDQgLy8gMTUzMDAKICAgID09CiAgICBibnogdm90ZV9hZnRlcl9hc3NlcnRAMTcKICAgIGJ5dGVjIDkgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCnZvdGVfYWZ0ZXJfYXNzZXJ0QDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNTAKICAgIC8vIHRoaXMuY3JlYXRlVm90ZSh2b3RlcykKICAgIGRpZyAxCiAgICBjYWxsc3ViIGNyZWF0ZVZvdGUKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIHZvdGUobWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCB2b3RlczogdWludDY0W10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnZvdGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgdm90ZV9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjpQb2xsLmhhc1ZvdGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKaGFzVm90ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjI1MwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjI1NQogICAgLy8gcmV0dXJuIHRoaXMudm90ZXModXNlcikuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjUzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDE4IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZUFraXRhREFPW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWtpdGFEQU86CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNwogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjIDYgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM3CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGJueiB1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWMgNiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo6UG9sbC5jcmVhdGVWb3RlKHZvdGVzOiBieXRlcykgLT4gYnl0ZXM6CmNyZWF0ZVZvdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwMAogICAgLy8gcHJpdmF0ZSBjcmVhdGVWb3RlKHZvdGVzOiB1aW50NjRbXSk6IHZvaWQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTAxCiAgICAvLyBsZXQgaW1wYWN0OiB1aW50NjQgPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMDIKICAgIC8vIGlmICh0aGlzLnR5cGUudmFsdWUgPT09IFNpbmdsZUNob2ljZUltcGFjdCB8fCB0aGlzLnR5cGUudmFsdWUgPT09IE11bHRpcGxlQ2hvaWNlSW1wYWN0KSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdHlwZSA9IEdsb2JhbFN0YXRlPFVpbnQ4Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNyAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyBpZiAodGhpcy50eXBlLnZhbHVlID09PSBTaW5nbGVDaG9pY2VJbXBhY3QgfHwgdGhpcy50eXBlLnZhbHVlID09PSBNdWx0aXBsZUNob2ljZUltcGFjdCkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hieXRlcyAweDFlCiAgICA9PQogICAgYm56IGNyZWF0ZVZvdGVfaWZfYm9keUAyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdHlwZSA9IEdsb2JhbFN0YXRlPFVpbnQ4Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNyAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyBpZiAodGhpcy50eXBlLnZhbHVlID09PSBTaW5nbGVDaG9pY2VJbXBhY3QgfHwgdGhpcy50eXBlLnZhbHVlID09PSBNdWx0aXBsZUNob2ljZUltcGFjdCkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hieXRlcyAweDI4CiAgICA9PQogICAgYnogY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDMKCmNyZWF0ZVZvdGVfaWZfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMDMKICAgIC8vIGltcGFjdCA9IGdldFVzZXJJbXBhY3QodGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlcikKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjIDYgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTAzCiAgICAvLyBpbXBhY3QgPSBnZXRVc2VySW1wYWN0KHRoaXMuYWtpdGFEQU8udmFsdWUsIFR4bi5zZW5kZXIpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzYtMTM5CiAgICAvLyByZXR1cm4gYWJpQ2FsbDx0eXBlb2YgQWtpdGFTb2NpYWxJbXBhY3QucHJvdG90eXBlLmdldFVzZXJJbXBhY3Q+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhU29jaWFsQXBwTGlzdChha2l0YURBTykuaW1wYWN0LAogICAgLy8gICBhcmdzOiBbYWNjb3VudF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ5CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhU29jaWFsQXBwTGlzdCkpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgInNhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTM3CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFTb2NpYWxBcHBMaXN0KGFraXRhREFPKS5pbXBhY3QsCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzNi0xMzkKICAgIC8vIHJldHVybiBhYmlDYWxsPHR5cGVvZiBBa2l0YVNvY2lhbEltcGFjdC5wcm90b3R5cGUuZ2V0VXNlckltcGFjdD4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFTb2NpYWxBcHBMaXN0KGFraXRhREFPKS5pbXBhY3QsCiAgICAvLyAgIGFyZ3M6IFthY2NvdW50XQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweGQ1NzRiYjEwIC8vIG1ldGhvZCAiZ2V0VXNlckltcGFjdChhZGRyZXNzKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDE4IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNwoKY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwNgogICAgLy8gaWYgKHRoaXMudHlwZS52YWx1ZSA9PT0gU2luZ2xlQ2hvaWNlIHx8IHRoaXMudHlwZS52YWx1ZSA9PT0gU2luZ2xlQ2hvaWNlSW1wYWN0KSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdHlwZSA9IEdsb2JhbFN0YXRlPFVpbnQ4Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNyAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTA2CiAgICAvLyBpZiAodGhpcy50eXBlLnZhbHVlID09PSBTaW5nbGVDaG9pY2UgfHwgdGhpcy50eXBlLnZhbHVlID09PSBTaW5nbGVDaG9pY2VJbXBhY3QpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoYnl0ZXMgMHgwYQogICAgPT0KICAgIGJueiBjcmVhdGVWb3RlX2lmX2JvZHlANQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxVaW50OD4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVR5cGUgfSkKICAgIGJ5dGVjIDcgLy8gInR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwNgogICAgLy8gaWYgKHRoaXMudHlwZS52YWx1ZSA9PT0gU2luZ2xlQ2hvaWNlIHx8IHRoaXMudHlwZS52YWx1ZSA9PT0gU2luZ2xlQ2hvaWNlSW1wYWN0KSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MWUKICAgID09CiAgICBieiBjcmVhdGVWb3RlX2Vsc2VfYm9keUAyNAoKY3JlYXRlVm90ZV9pZl9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwNwogICAgLy8gbG9nZ2VkQXNzZXJ0KHZvdGVzLmxlbmd0aCA9PT0gMSwgRVJSX0lOVkFMSURfVk9URV9DT1VOVCkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IGNyZWF0ZVZvdGVfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDE5IC8vICJFUlI6SVZDVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJVkNUCgpjcmVhdGVWb3RlX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMDgKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlc1swXSA8PSB0aGlzLm9wdGlvbkNvdW50LnZhbHVlIC0gMSwgRVJSX0lOVkFMSURfVk9URV9PUFRJT04pCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBvcHRpb25Db3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleU9wdGlvbkNvdW50IH0pCiAgICBieXRlYyAxMSAvLyAib3B0aW9uX2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMDgKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlc1swXSA8PSB0aGlzLm9wdGlvbkNvdW50LnZhbHVlIC0gMSwgRVJSX0lOVkFMSURfVk9URV9PUFRJT04pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIDw9CiAgICBibnogY3JlYXRlVm90ZV9hZnRlcl9hc3NlcnRAOQogICAgYnl0ZWMgMTIgLy8gIkVSUjpJVk9QIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklWT1AKCmNyZWF0ZVZvdGVfYWZ0ZXJfYXNzZXJ0QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExMAogICAgLy8gaWYgKHZvdGVzWzBdID09PSAwKSB7CiAgICBmcmFtZV9kaWcgNgogICAgYm56IGNyZWF0ZVZvdGVfZWxzZV9ib2R5QDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gdGhpcy52b3Rlc09uZS52YWx1ZSArPSBpbXBhY3QKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyB2b3Rlc09uZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNPbmUgfSkKICAgIGJ5dGVjXzEgLy8gInZvdGVzX29uZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTExCiAgICAvLyB0aGlzLnZvdGVzT25lLnZhbHVlICs9IGltcGFjdAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyA3CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyB2b3Rlc09uZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNPbmUgfSkKICAgIGJ5dGVjXzEgLy8gInZvdGVzX29uZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTExCiAgICAvLyB0aGlzLnZvdGVzT25lLnZhbHVlICs9IGltcGFjdAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNyZWF0ZVZvdGVfYWZ0ZXJfaWZfZWxzZUA1MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTQ0CiAgICAvLyB0aGlzLnZvdGVzKFR4bi5zZW5kZXIpLmNyZWF0ZSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gdGhpcy5ib3hDb3VudC52YWx1ZSArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gYm94Q291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlCb3hDb3VudCB9KQogICAgYnl0ZWNfMCAvLyAiYm94X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxNDUKICAgIC8vIHRoaXMuYm94Q291bnQudmFsdWUgKz0gMQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBib3hDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleUJveENvdW50IH0pCiAgICBieXRlY18wIC8vICJib3hfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gdGhpcy5ib3hDb3VudC52YWx1ZSArPSAxCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY3JlYXRlVm90ZV9lbHNlX2JvZHlAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExMgogICAgLy8gfSBlbHNlIGlmICh2b3Rlc1swXSA9PT0gMSkgewogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogY3JlYXRlVm90ZV9lbHNlX2JvZHlAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyB0aGlzLnZvdGVzVHdvLnZhbHVlICs9IGltcGFjdAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODgKICAgIC8vIHZvdGVzVHdvID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc1R3byB9KQogICAgYnl0ZWNfMiAvLyAidm90ZXNfdHdvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIHRoaXMudm90ZXNUd28udmFsdWUgKz0gaW1wYWN0CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDcKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODgKICAgIC8vIHZvdGVzVHdvID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc1R3byB9KQogICAgYnl0ZWNfMiAvLyAidm90ZXNfdHdvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIHRoaXMudm90ZXNUd28udmFsdWUgKz0gaW1wYWN0CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBjcmVhdGVWb3RlX2FmdGVyX2lmX2Vsc2VANTEKCmNyZWF0ZVZvdGVfZWxzZV9ib2R5QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIH0gZWxzZSBpZiAodm90ZXNbMF0gPT09IDIpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGJ6IGNyZWF0ZVZvdGVfZWxzZV9ib2R5QDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExNQogICAgLy8gdGhpcy52b3Rlc1RocmVlLnZhbHVlICs9IGltcGFjdAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODkKICAgIC8vIHZvdGVzVGhyZWUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVZvdGVzVGhyZWUgfSkKICAgIGJ5dGVjXzMgLy8gInZvdGVzX3RocmVlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMTUKICAgIC8vIHRoaXMudm90ZXNUaHJlZS52YWx1ZSArPSBpbXBhY3QKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgNwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo4OQogICAgLy8gdm90ZXNUaHJlZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNUaHJlZSB9KQogICAgYnl0ZWNfMyAvLyAidm90ZXNfdGhyZWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExNQogICAgLy8gdGhpcy52b3Rlc1RocmVlLnZhbHVlICs9IGltcGFjdAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDUxCgpjcmVhdGVWb3RlX2Vsc2VfYm9keUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTE2CiAgICAvLyB9IGVsc2UgaWYgKHZvdGVzWzBdID09PSAzKSB7CiAgICBmcmFtZV9kaWcgNgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogY3JlYXRlVm90ZV9lbHNlX2JvZHlAMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyB0aGlzLnZvdGVzRm91ci52YWx1ZSArPSBpbXBhY3QKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjkwCiAgICAvLyB2b3Rlc0ZvdXIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVZvdGVzRm91ciB9KQogICAgYnl0ZWMgNCAvLyAidm90ZXNfZm91ciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyB0aGlzLnZvdGVzRm91ci52YWx1ZSArPSBpbXBhY3QKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgNwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo5MAogICAgLy8gdm90ZXNGb3VyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc0ZvdXIgfSkKICAgIGJ5dGVjIDQgLy8gInZvdGVzX2ZvdXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExNwogICAgLy8gdGhpcy52b3Rlc0ZvdXIudmFsdWUgKz0gaW1wYWN0CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBjcmVhdGVWb3RlX2FmdGVyX2lmX2Vsc2VANTEKCmNyZWF0ZVZvdGVfZWxzZV9ib2R5QDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIH0gZWxzZSBpZiAodm90ZXNbMF0gPT09IDQpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBjcmVhdGVWb3RlX2FmdGVyX2lmX2Vsc2VANTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTE5CiAgICAvLyB0aGlzLnZvdGVzRml2ZS52YWx1ZSArPSBpbXBhY3QKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjkxCiAgICAvLyB2b3Rlc0ZpdmUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVZvdGVzRml2ZSB9KQogICAgYnl0ZWMgNSAvLyAidm90ZXNfZml2ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTE5CiAgICAvLyB0aGlzLnZvdGVzRml2ZS52YWx1ZSArPSBpbXBhY3QKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgNwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdm90ZXNGaXZlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc0ZpdmUgfSkKICAgIGJ5dGVjIDUgLy8gInZvdGVzX2ZpdmUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExOQogICAgLy8gdGhpcy52b3Rlc0ZpdmUudmFsdWUgKz0gaW1wYWN0CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBjcmVhdGVWb3RlX2FmdGVyX2lmX2Vsc2VANTEKCmNyZWF0ZVZvdGVfZWxzZV9ib2R5QDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMjIKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlcy5sZW5ndGggPD0gdGhpcy5tYXhTZWxlY3RlZC52YWx1ZSwgRVJSX0lOVkFMSURfVk9URV9DT1VOVCkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo3MwogICAgLy8gbWF4U2VsZWN0ZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlNYXhTZWxlY3RlZCB9KQogICAgYnl0ZWMgMTMgLy8gIm1heF9zZWxlY3RlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTIyCiAgICAvLyBsb2dnZWRBc3NlcnQodm90ZXMubGVuZ3RoIDw9IHRoaXMubWF4U2VsZWN0ZWQudmFsdWUsIEVSUl9JTlZBTElEX1ZPVEVfQ09VTlQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPD0KICAgIGJueiBjcmVhdGVWb3RlX2FmdGVyX2Fzc2VydEAyNgogICAgYnl0ZWMgMTkgLy8gIkVSUjpJVkNUIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklWQ1QKCmNyZWF0ZVZvdGVfYWZ0ZXJfYXNzZXJ0QDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB2b3Rlcy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKY3JlYXRlVm90ZV93aGlsZV90b3BAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEyNAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHZvdGVzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGNyZWF0ZVZvdGVfYWZ0ZXJfaWZfZWxzZUA1MQogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlc1tpXSA8PSB0aGlzLm9wdGlvbkNvdW50LnZhbHVlIC0gMSwgRVJSX0lOVkFMSURfVk9URV9PUFRJT04pCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBvcHRpb25Db3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleU9wdGlvbkNvdW50IH0pCiAgICBieXRlYyAxMSAvLyAib3B0aW9uX2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlc1tpXSA8PSB0aGlzLm9wdGlvbkNvdW50LnZhbHVlIC0gMSwgRVJSX0lOVkFMSURfVk9URV9PUFRJT04pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIDw9CiAgICBibnogY3JlYXRlVm90ZV9hZnRlcl9hc3NlcnRAMzAKICAgIGJ5dGVjIDEyIC8vICJFUlI6SVZPUCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJVk9QCgpjcmVhdGVWb3RlX2FmdGVyX2Fzc2VydEAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyBmb3IgKGxldCBqOiB1aW50NjQgPSBpICsgMTsgaiA8IHZvdGVzLmxlbmd0aDsgaiArPSAxKSB7CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBmcmFtZV9idXJ5IDQKCmNyZWF0ZVZvdGVfd2hpbGVfdG9wQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGZvciAobGV0IGo6IHVpbnQ2NCA9IGkgKyAxOyBqIDwgdm90ZXMubGVuZ3RoOyBqICs9IDEpIHsKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogY3JlYXRlVm90ZV9hZnRlcl93aGlsZUAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlc1tpXSAhPT0gdm90ZXNbal0sIEVSUl9JTlZBTElEX1ZPVEVfT1BUSU9OKQogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyA1CiAgICAhPQogICAgYm56IGNyZWF0ZVZvdGVfYWZ0ZXJfYXNzZXJ0QDM0CiAgICBieXRlYyAxMiAvLyAiRVJSOklWT1AiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVZPUAoKY3JlYXRlVm90ZV9hZnRlcl9hc3NlcnRAMzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEyNgogICAgLy8gZm9yIChsZXQgajogdWludDY0ID0gaSArIDE7IGogPCB2b3Rlcy5sZW5ndGg7IGogKz0gMSkgewogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgY3JlYXRlVm90ZV93aGlsZV90b3BAMzEKCmNyZWF0ZVZvdGVfYWZ0ZXJfd2hpbGVAMzU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gaWYgKHZvdGVzW2ldID09PSAwKSB7CiAgICBmcmFtZV9kaWcgNQogICAgYm56IGNyZWF0ZVZvdGVfZWxzZV9ib2R5QDM3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gdGhpcy52b3Rlc09uZS52YWx1ZSArPSBpbXBhY3QKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyB2b3Rlc09uZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNPbmUgfSkKICAgIGJ5dGVjXzEgLy8gInZvdGVzX29uZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyB0aGlzLnZvdGVzT25lLnZhbHVlICs9IGltcGFjdAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyA3CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyB2b3Rlc09uZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNPbmUgfSkKICAgIGJ5dGVjXzEgLy8gInZvdGVzX29uZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyB0aGlzLnZvdGVzT25lLnZhbHVlICs9IGltcGFjdAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNyZWF0ZVZvdGVfYWZ0ZXJfaWZfZWxzZUA0OToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgY3JlYXRlVm90ZV93aGlsZV90b3BAMjcKCmNyZWF0ZVZvdGVfZWxzZV9ib2R5QDM3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIH0gZWxzZSBpZiAodm90ZXNbaV0gPT09IDEpIHsKICAgIGZyYW1lX2RpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IGNyZWF0ZVZvdGVfZWxzZV9ib2R5QDM5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzMwogICAgLy8gdGhpcy52b3Rlc1R3by52YWx1ZSArPSBpbXBhY3QKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg4CiAgICAvLyB2b3Rlc1R3byA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNUd28gfSkKICAgIGJ5dGVjXzIgLy8gInZvdGVzX3R3byIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyB0aGlzLnZvdGVzVHdvLnZhbHVlICs9IGltcGFjdAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyA3CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg4CiAgICAvLyB2b3Rlc1R3byA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNUd28gfSkKICAgIGJ5dGVjXzIgLy8gInZvdGVzX3R3byIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyB0aGlzLnZvdGVzVHdvLnZhbHVlICs9IGltcGFjdAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDQ5CgpjcmVhdGVWb3RlX2Vsc2VfYm9keUAzOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyB9IGVsc2UgaWYgKHZvdGVzW2ldID09PSAyKSB7CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBieiBjcmVhdGVWb3RlX2Vsc2VfYm9keUA0MQogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMzUKICAgIC8vIHRoaXMudm90ZXNUaHJlZS52YWx1ZSArPSBpbXBhY3QKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyB2b3Rlc1RocmVlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc1RocmVlIH0pCiAgICBieXRlY18zIC8vICJ2b3Rlc190aHJlZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTM1CiAgICAvLyB0aGlzLnZvdGVzVGhyZWUudmFsdWUgKz0gaW1wYWN0CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDcKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODkKICAgIC8vIHZvdGVzVGhyZWUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVZvdGVzVGhyZWUgfSkKICAgIGJ5dGVjXzMgLy8gInZvdGVzX3RocmVlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMzUKICAgIC8vIHRoaXMudm90ZXNUaHJlZS52YWx1ZSArPSBpbXBhY3QKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGNyZWF0ZVZvdGVfYWZ0ZXJfaWZfZWxzZUA0OQoKY3JlYXRlVm90ZV9lbHNlX2JvZHlANDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzNgogICAgLy8gfSBlbHNlIGlmICh2b3Rlc1tpXSA9PT0gMykgewogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGNyZWF0ZVZvdGVfZWxzZV9ib2R5QDQzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzNwogICAgLy8gdGhpcy52b3Rlc0ZvdXIudmFsdWUgKz0gaW1wYWN0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo5MAogICAgLy8gdm90ZXNGb3VyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc0ZvdXIgfSkKICAgIGJ5dGVjIDQgLy8gInZvdGVzX2ZvdXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzNwogICAgLy8gdGhpcy52b3Rlc0ZvdXIudmFsdWUgKz0gaW1wYWN0CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDcKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTAKICAgIC8vIHZvdGVzRm91ciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNGb3VyIH0pCiAgICBieXRlYyA0IC8vICJ2b3Rlc19mb3VyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMzcKICAgIC8vIHRoaXMudm90ZXNGb3VyLnZhbHVlICs9IGltcGFjdAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDQ5CgpjcmVhdGVWb3RlX2Vsc2VfYm9keUA0MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTM4CiAgICAvLyB9IGVsc2UgaWYgKHZvdGVzW2ldID09PSA0KSB7CiAgICBmcmFtZV9kaWcgNQogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDQ5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzOQogICAgLy8gdGhpcy52b3Rlc0ZpdmUudmFsdWUgKz0gaW1wYWN0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdm90ZXNGaXZlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc0ZpdmUgfSkKICAgIGJ5dGVjIDUgLy8gInZvdGVzX2ZpdmUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzOQogICAgLy8gdGhpcy52b3Rlc0ZpdmUudmFsdWUgKz0gaW1wYWN0CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDcKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTEKICAgIC8vIHZvdGVzRml2ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNGaXZlIH0pCiAgICBieXRlYyA1IC8vICJ2b3Rlc19maXZlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMzkKICAgIC8vIHRoaXMudm90ZXNGaXZlLnZhbHVlICs9IGltcGFjdAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDQ5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=" }, "byteCode": { "approval": "CyAFAAECCMR3JhQJYm94X2NvdW50CXZvdGVzX29uZQl2b3Rlc190d28Ldm90ZXNfdGhyZWUKdm90ZXNfZm91cgp2b3Rlc19maXZlCWFraXRhX2RhbwR0eXBlCGVuZF90aW1lCEVSUjpJUEFZB2dhdGVfaWQMb3B0aW9uX2NvdW50CEVSUjpJVk9QDG1heF9zZWxlY3RlZAhFUlI6UEFDVAhFUlI6UEVORAhFUlI6QVZPVAhFUlI6SVZPVAQVH3x1CEVSUjpJVkNUMRhAABEpImcqImcrImcnBCJnJwUiZ4AEJIfDLDYaAI4BAEsxGRREMRhBADSCBgThQZCABFvPkQAE3TCcewRaf0kyBDPpLJQEhU3t4DYaAI4GAj4DCwP6BIAEmgABACNDgASVqvXrNhoAjgEAIwAxGYEFEjEYEERCAraKAgGL/lcCAIv/JAtLAUxZSlkkCFiJgAA2GgFJFSUSRBc2GgJJFSMSRDYaA0kVJRJEFzYaBEkVJRJEFzYaBUkVgSgSRDYaBkkiWSQISwEVEkRXAgA2GgdHAiJZSU4CJAtMSRVMVwIAIklLBQxBACRHAiQLSwNJTwJZSUsHSU4EEkRLARVSIlkkCAhFBSMIRQFC/9VLAyQISwMSRDYaCEkVJRJEF0UNMg1AAAyACEVSUjpCREVQsAAyB0sKDEAADIAIRVJSOklFVE2wAEsKF4EoDEAADIAIRVJSOklQVFmwACcGSwxnJwdLC2cnCksNZycISwpngAZmdW5kZXJLCGeACHF1ZXN0aW9uSwdnSwQkD0EBCksEgQUOQQECI0AADIAIRVJSOklPUEOwAEsKgAEUEkAACUsKgAEoEkEAJksIJA9BANVLBCMJSwkPQQDLI0AADIAIRVJSOklNWFOwACcNSwlnJwtLBUlOAmcoImdJREsGSU4CIoj+h1cCAIAKb3B0aW9uX29uZUxnI0sBDERMI4j+bFcCAIAKb3B0aW9uX3R3b0xngQMPQQAeJEsFDERLBSSI/kpXAgCADG9wdGlvbl90aHJlZUxnSwSBBA9BAB+BA0sFDERLBYEDiP4iVwIAgAtvcHRpb25fZm91ckxnSwSBBQ9BAB+BBEsFDERLBYEEiP37VwIAgAtvcHRpb25fZml2ZUxnI0MiQv8yIkL++yKAADYaAUcCIllJTgKBIAskCEwVEkQyByInCGVEDUAABCcOsAAiRQNLAksBDEEAY0sBVwIASwOBIAuBIFhJRQW9RQFAAAyACEVSUjpOVk9UsABLA0m8SLGAGE1CUiByZWZ1bmQgZm9yIHBvbGwgdm90ZbIFIQSyCLIHI7IQIrIBsyIoZUQjCShMZ0sCIwhFA0L/lSNDMQAyCRJAAAyACEVSUjpNQ0ZGsAAyByInCGVEDUAABCcOsAAiKGVEQQAMgAhFUlI6U0hWQrAAI0MigAAxFiQJSTgQIxJEMRYjCUk4EIEGEkQ2GgFHAiJZSU4CJQskCEwVEkQyByInCGVEDkAABCcPsAAxAL1FAUEABCcQsABJgQUOQQCfSUEAmyNAAAQnEbAAIicGZUQxAEUHIicKZUxFB0RLAzgYTIADYWFsZUiBKFsSQQBrSwI4GUAAZEsCOBuBBBJBAFpLAiLCGoAEQ5ImVRJBAEtLAiPCGksGEkEAQEsCJMIaSwUWEkEANCNAAAyACEVSUjpGR1RFsABLAzgHMgoSQAAEJwmwAEsDOAghBBJAAAQnCbAASwGIAN9II0MiQv/JIkL/YjEWIwlJOBAjEkQ2GgFHAiJZSU4CJQskCEwVEkQyByInCGVEDkAABCcPsAAxAL1FAUEABCcQsABJgQUOQQBESUEAQCNAAAQnEbAAIicKZURBAAyACEVSUjpIR1RFsABLAjgHMgoSQAAEJwmwAEsCOAghBBJAAAQnCbAASwGIAFVII0MiQv+9NhoBSRWBIBJEvUUBgAEAIk8CVCcSTFCwI0M2GgFJFSUSRBcxACInBmVEgAZ3YWxsZXRlSHIIRBJAAAyACEVSUjpOREFPsAAnBksBZyNDigEBIoAARwUjIicHZUSAAR4SQAAMIicHZUSAASgSQQA9IicGZUQxALFMgANzYWxlSIEQW7IYgATVdLsQshqyGoEGshAisgGztD5JVwQATFcABCcSEkRJFSUSRBeMByInB2VEgAEKEkAADCInB2VEgAEeEkEAm4v/IlkjEkAABCcTsACL/yRbSYwGIicLZUQjCQ5AAAQnDLAAiwZAAB0iKWVEiwcIKUxnMQAiuUgiKGVEIwgoTGeL/4wAiYsGIxJBAA0iKmVEiwcIKkxnQv/ZiwYkEkEADSIrZUSLBwgrTGdC/8WLBoEDEkEADyInBGVEiwcIJwRMZ0L/rosGgQQSQf+mIicFZUSLBwgnBUxnQv+Xi/8iWUmMASInDWVEDkAABCcTsAAijAKLAosBDEH/eIv/VwIASYwAiwIlC1tJjAUiJwtlRCMJDkAABCcMsACLAiMISYwDjASLBIsBDEEAG4sEJQuLAExbiwUTQAAEJwywAIsEIwiMBEL/3YsFQAARIillRIsHCClMZ4sDjAJC/5eLBSMSQQANIiplRIsHCCpMZ0L/5YsFJBJBAA0iK2VEiwcIK0xnQv/RiwWBAxJBAA8iJwRlRIsHCCcETGdC/7qLBYEEEkH/siInBWVEiwcIJwVMZ0L/ow==", "clear": "C4EBQw==" }, "events": [], "templateVariables": {} };
19
+ var PollParamsFactory = class _PollParamsFactory {
20
+ /**
21
+ * Gets available create ABI call param factories
22
+ */
23
+ static get create() {
24
+ return {
25
+ _resolveByMethod(params) {
26
+ switch (params.method) {
27
+ case "create":
28
+ case "create(uint64,uint8,uint64,uint64,(address,uint64),string,string[],uint64)void":
29
+ return _PollParamsFactory.create.create(params);
30
+ }
31
+ throw new Error(`Unknown ' + verb + ' method`);
32
+ },
33
+ /**
34
+ * Constructs create ABI call params for the Poll smart contract using the create(uint64,uint8,uint64,uint64,(address,uint64),string,string[],uint64)void ABI method
35
+ *
36
+ * @param params Parameters for the call
37
+ * @returns An `AppClientMethodCallParams` object for the call
38
+ */
39
+ create(params) {
40
+ return {
41
+ ...params,
42
+ method: "create(uint64,uint8,uint64,uint64,(address,uint64),string,string[],uint64)void",
43
+ args: Array.isArray(params.args) ? params.args : [params.args.akitaDao, params.args.type, params.args.endTime, params.args.maxSelected, params.args.funder, params.args.question, params.args.options, params.args.gateId]
44
+ };
45
+ }
46
+ };
47
+ }
48
+ /**
49
+ * Gets available delete ABI call param factories
50
+ */
51
+ static get delete() {
52
+ return {
53
+ _resolveByMethod(params) {
54
+ switch (params.method) {
55
+ case "deleteApplication":
56
+ case "deleteApplication()void":
57
+ return _PollParamsFactory.delete.deleteApplication(params);
58
+ }
59
+ throw new Error(`Unknown ' + verb + ' method`);
60
+ },
61
+ /**
62
+ * Constructs delete ABI call params for the Poll smart contract using the deleteApplication()void ABI method
63
+ *
64
+ * @param params Parameters for the call
65
+ * @returns An `AppClientMethodCallParams` object for the call
66
+ */
67
+ deleteApplication(params) {
68
+ return {
69
+ ...params,
70
+ method: "deleteApplication()void",
71
+ args: Array.isArray(params.args) ? params.args : []
72
+ };
73
+ }
74
+ };
75
+ }
76
+ /**
77
+ * Constructs a no op call for the deleteBoxes(address[])void ABI method
78
+ *
79
+ * @param params Parameters for the call
80
+ * @returns An `AppClientMethodCallParams` object for the call
81
+ */
82
+ static deleteBoxes(params) {
83
+ return {
84
+ ...params,
85
+ method: "deleteBoxes(address[])void",
86
+ args: Array.isArray(params.args) ? params.args : [params.args.addresses]
87
+ };
88
+ }
89
+ /**
90
+ * Constructs a no op call for the gatedVote(pay,appl,uint64[])void ABI method
91
+ *
92
+ * @param params Parameters for the call
93
+ * @returns An `AppClientMethodCallParams` object for the call
94
+ */
95
+ static gatedVote(params) {
96
+ return {
97
+ ...params,
98
+ method: "gatedVote(pay,appl,uint64[])void",
99
+ args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.gateTxn, params.args.votes]
100
+ };
101
+ }
102
+ /**
103
+ * Constructs a no op call for the vote(pay,uint64[])void ABI method
104
+ *
105
+ * @param params Parameters for the call
106
+ * @returns An `AppClientMethodCallParams` object for the call
107
+ */
108
+ static vote(params) {
109
+ return {
110
+ ...params,
111
+ method: "vote(pay,uint64[])void",
112
+ args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.votes]
113
+ };
114
+ }
115
+ /**
116
+ * Constructs a no op call for the hasVoted(address)bool ABI method
117
+ *
118
+ * @param params Parameters for the call
119
+ * @returns An `AppClientMethodCallParams` object for the call
120
+ */
121
+ static hasVoted(params) {
122
+ return {
123
+ ...params,
124
+ method: "hasVoted(address)bool",
125
+ args: Array.isArray(params.args) ? params.args : [params.args.user]
126
+ };
127
+ }
128
+ /**
129
+ * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method
130
+ *
131
+ * @param params Parameters for the call
132
+ * @returns An `AppClientMethodCallParams` object for the call
133
+ */
134
+ static updateAkitaDao(params) {
135
+ return {
136
+ ...params,
137
+ method: "updateAkitaDAO(uint64)void",
138
+ args: Array.isArray(params.args) ? params.args : [params.args.akitaDao]
139
+ };
140
+ }
141
+ /**
142
+ * Constructs a no op call for the opUp()void ABI method
143
+ *
144
+ * @param params Parameters for the call
145
+ * @returns An `AppClientMethodCallParams` object for the call
146
+ */
147
+ static opUp(params) {
148
+ return {
149
+ ...params,
150
+ method: "opUp()void",
151
+ args: Array.isArray(params.args) ? params.args : []
152
+ };
153
+ }
154
+ };
155
+ var PollFactory = class {
156
+ /**
157
+ * The underlying `AppFactory` for when you want to have more flexibility
158
+ */
159
+ appFactory;
160
+ /**
161
+ * Creates a new instance of `PollFactory`
162
+ *
163
+ * @param params The parameters to initialise the app factory with
164
+ */
165
+ constructor(params) {
166
+ this.appFactory = new _AppFactory({
167
+ ...params,
168
+ appSpec: APP_SPEC
169
+ });
170
+ }
171
+ /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */
172
+ get appName() {
173
+ return this.appFactory.appName;
174
+ }
175
+ /** The ARC-56 app spec being used */
176
+ get appSpec() {
177
+ return APP_SPEC;
178
+ }
179
+ /** A reference to the underlying `AlgorandClient` this app factory is using. */
180
+ get algorand() {
181
+ return this.appFactory.algorand;
182
+ }
183
+ /**
184
+ * Returns a new `AppClient` client for an app instance of the given ID.
185
+ *
186
+ * Automatically populates appName, defaultSender and source maps from the factory
187
+ * if not specified in the params.
188
+ * @param params The parameters to create the app client
189
+ * @returns The `AppClient`
190
+ */
191
+ getAppClientById(params) {
192
+ return new PollClient(this.appFactory.getAppClientById(params));
193
+ }
194
+ /**
195
+ * Returns a new `AppClient` client, resolving the app by creator address and name
196
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
197
+ *
198
+ * Automatically populates appName, defaultSender and source maps from the factory
199
+ * if not specified in the params.
200
+ * @param params The parameters to create the app client
201
+ * @returns The `AppClient`
202
+ */
203
+ async getAppClientByCreatorAndName(params) {
204
+ return new PollClient(await this.appFactory.getAppClientByCreatorAndName(params));
205
+ }
206
+ /**
207
+ * Idempotently deploys the Poll smart contract.
208
+ *
209
+ * @param params The arguments for the contract calls and any additional parameters for the call
210
+ * @returns The deployment result
211
+ */
212
+ async deploy(params = {}) {
213
+ var _a, _b;
214
+ const result = await this.appFactory.deploy({
215
+ ...params,
216
+ createParams: ((_a = params.createParams) == null ? void 0 : _a.method) ? PollParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams : void 0,
217
+ deleteParams: ((_b = params.deleteParams) == null ? void 0 : _b.method) ? PollParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams : void 0
218
+ });
219
+ return { result: result.result, appClient: new PollClient(result.appClient) };
220
+ }
221
+ /**
222
+ * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
223
+ */
224
+ params = {
225
+ /**
226
+ * Gets available create methods
227
+ */
228
+ create: {
229
+ /**
230
+ * Creates a new instance of the Poll smart contract using the create(uint64,uint8,uint64,uint64,(address,uint64),string,string[],uint64)void ABI method.
231
+ *
232
+ * @param params The params for the smart contract call
233
+ * @returns The create params
234
+ */
235
+ create: (params) => {
236
+ return this.appFactory.params.create(PollParamsFactory.create.create(params));
237
+ }
238
+ },
239
+ /**
240
+ * Gets available deployDelete methods
241
+ */
242
+ deployDelete: {
243
+ /**
244
+ * Deletes an existing instance of the Poll smart contract using the deleteApplication()void ABI method.
245
+ *
246
+ * @param params The params for the smart contract call
247
+ * @returns The deployDelete params
248
+ */
249
+ deleteApplication: (params = { args: [] }) => {
250
+ return this.appFactory.params.deployDelete(PollParamsFactory.delete.deleteApplication(params));
251
+ }
252
+ }
253
+ };
254
+ /**
255
+ * Create transactions for the current app
256
+ */
257
+ createTransaction = {
258
+ /**
259
+ * Gets available create methods
260
+ */
261
+ create: {
262
+ /**
263
+ * Creates a new instance of the Poll smart contract using the create(uint64,uint8,uint64,uint64,(address,uint64),string,string[],uint64)void ABI method.
264
+ *
265
+ * @param params The params for the smart contract call
266
+ * @returns The create transaction
267
+ */
268
+ create: (params) => {
269
+ return this.appFactory.createTransaction.create(PollParamsFactory.create.create(params));
270
+ }
271
+ }
272
+ };
273
+ /**
274
+ * Send calls to the current app
275
+ */
276
+ send = {
277
+ /**
278
+ * Gets available create methods
279
+ */
280
+ create: {
281
+ /**
282
+ * Creates a new instance of the Poll smart contract using an ABI method call using the create(uint64,uint8,uint64,uint64,(address,uint64),string,string[],uint64)void ABI method.
283
+ *
284
+ * @param params The params for the smart contract call
285
+ * @returns The create result
286
+ */
287
+ create: async (params) => {
288
+ const result = await this.appFactory.send.create(PollParamsFactory.create.create(params));
289
+ return { result: { ...result.result, return: result.result.return }, appClient: new PollClient(result.appClient) };
290
+ }
291
+ }
292
+ };
293
+ };
294
+ var PollClient = class _PollClient {
295
+ /**
296
+ * The underlying `AppClient` for when you want to have more flexibility
297
+ */
298
+ appClient;
299
+ constructor(appClientOrParams) {
300
+ this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({
301
+ ...appClientOrParams,
302
+ appSpec: APP_SPEC
303
+ });
304
+ }
305
+ /**
306
+ * Returns a new `PollClient` client, resolving the app by creator address and name
307
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
308
+ * @param params The parameters to create the app client
309
+ */
310
+ static async fromCreatorAndName(params) {
311
+ return new _PollClient(await _AppClient.fromCreatorAndName({ ...params, appSpec: APP_SPEC }));
312
+ }
313
+ /**
314
+ * Returns an `PollClient` instance for the current network based on
315
+ * pre-determined network-specific app IDs specified in the ARC-56 app spec.
316
+ *
317
+ * If no IDs are in the app spec or the network isn't recognised, an error is thrown.
318
+ * @param params The parameters to create the app client
319
+ */
320
+ static async fromNetwork(params) {
321
+ return new _PollClient(await _AppClient.fromNetwork({ ...params, appSpec: APP_SPEC }));
322
+ }
323
+ /** The ID of the app instance this client is linked to. */
324
+ get appId() {
325
+ return this.appClient.appId;
326
+ }
327
+ /** The app address of the app instance this client is linked to. */
328
+ get appAddress() {
329
+ return this.appClient.appAddress;
330
+ }
331
+ /** The name of the app. */
332
+ get appName() {
333
+ return this.appClient.appName;
334
+ }
335
+ /** The ARC-56 app spec being used */
336
+ get appSpec() {
337
+ return this.appClient.appSpec;
338
+ }
339
+ /** A reference to the underlying `AlgorandClient` this app client is using. */
340
+ get algorand() {
341
+ return this.appClient.algorand;
342
+ }
343
+ /**
344
+ * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
345
+ */
346
+ params = {
347
+ /**
348
+ * Gets available delete methods
349
+ */
350
+ delete: {
351
+ /**
352
+ * Deletes an existing instance of the Poll smart contract using the `deleteApplication()void` ABI method.
353
+ *
354
+ * @param params The params for the smart contract call
355
+ * @returns The delete params
356
+ */
357
+ deleteApplication: (params = { args: [] }) => {
358
+ return this.appClient.params.delete(PollParamsFactory.delete.deleteApplication(params));
359
+ }
360
+ },
361
+ /**
362
+ * Makes a clear_state call to an existing instance of the Poll smart contract.
363
+ *
364
+ * @param params The params for the bare (raw) call
365
+ * @returns The clearState result
366
+ */
367
+ clearState: (params) => {
368
+ return this.appClient.params.bare.clearState(params);
369
+ },
370
+ /**
371
+ * Makes a call to the Poll smart contract using the `deleteBoxes(address[])void` ABI method.
372
+ *
373
+ * @param params The params for the smart contract call
374
+ * @returns The call params
375
+ */
376
+ deleteBoxes: (params) => {
377
+ return this.appClient.params.call(PollParamsFactory.deleteBoxes(params));
378
+ },
379
+ /**
380
+ * Makes a call to the Poll smart contract using the `gatedVote(pay,appl,uint64[])void` ABI method.
381
+ *
382
+ * @param params The params for the smart contract call
383
+ * @returns The call params
384
+ */
385
+ gatedVote: (params) => {
386
+ return this.appClient.params.call(PollParamsFactory.gatedVote(params));
387
+ },
388
+ /**
389
+ * Makes a call to the Poll smart contract using the `vote(pay,uint64[])void` ABI method.
390
+ *
391
+ * @param params The params for the smart contract call
392
+ * @returns The call params
393
+ */
394
+ vote: (params) => {
395
+ return this.appClient.params.call(PollParamsFactory.vote(params));
396
+ },
397
+ /**
398
+ * Makes a call to the Poll smart contract using the `hasVoted(address)bool` ABI method.
399
+ *
400
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
401
+ *
402
+ * @param params The params for the smart contract call
403
+ * @returns The call params
404
+ */
405
+ hasVoted: (params) => {
406
+ return this.appClient.params.call(PollParamsFactory.hasVoted(params));
407
+ },
408
+ /**
409
+ * Makes a call to the Poll smart contract using the `updateAkitaDAO(uint64)void` ABI method.
410
+ *
411
+ * @param params The params for the smart contract call
412
+ * @returns The call params
413
+ */
414
+ updateAkitaDao: (params) => {
415
+ return this.appClient.params.call(PollParamsFactory.updateAkitaDao(params));
416
+ },
417
+ /**
418
+ * Makes a call to the Poll smart contract using the `opUp()void` ABI method.
419
+ *
420
+ * @param params The params for the smart contract call
421
+ * @returns The call params
422
+ */
423
+ opUp: (params = { args: [] }) => {
424
+ return this.appClient.params.call(PollParamsFactory.opUp(params));
425
+ }
426
+ };
427
+ /**
428
+ * Create transactions for the current app
429
+ */
430
+ createTransaction = {
431
+ /**
432
+ * Gets available delete methods
433
+ */
434
+ delete: {
435
+ /**
436
+ * Deletes an existing instance of the Poll smart contract using the `deleteApplication()void` ABI method.
437
+ *
438
+ * @param params The params for the smart contract call
439
+ * @returns The delete transaction
440
+ */
441
+ deleteApplication: (params = { args: [] }) => {
442
+ return this.appClient.createTransaction.delete(PollParamsFactory.delete.deleteApplication(params));
443
+ }
444
+ },
445
+ /**
446
+ * Makes a clear_state call to an existing instance of the Poll smart contract.
447
+ *
448
+ * @param params The params for the bare (raw) call
449
+ * @returns The clearState result
450
+ */
451
+ clearState: (params) => {
452
+ return this.appClient.createTransaction.bare.clearState(params);
453
+ },
454
+ /**
455
+ * Makes a call to the Poll smart contract using the `deleteBoxes(address[])void` ABI method.
456
+ *
457
+ * @param params The params for the smart contract call
458
+ * @returns The call transaction
459
+ */
460
+ deleteBoxes: (params) => {
461
+ return this.appClient.createTransaction.call(PollParamsFactory.deleteBoxes(params));
462
+ },
463
+ /**
464
+ * Makes a call to the Poll smart contract using the `gatedVote(pay,appl,uint64[])void` ABI method.
465
+ *
466
+ * @param params The params for the smart contract call
467
+ * @returns The call transaction
468
+ */
469
+ gatedVote: (params) => {
470
+ return this.appClient.createTransaction.call(PollParamsFactory.gatedVote(params));
471
+ },
472
+ /**
473
+ * Makes a call to the Poll smart contract using the `vote(pay,uint64[])void` ABI method.
474
+ *
475
+ * @param params The params for the smart contract call
476
+ * @returns The call transaction
477
+ */
478
+ vote: (params) => {
479
+ return this.appClient.createTransaction.call(PollParamsFactory.vote(params));
480
+ },
481
+ /**
482
+ * Makes a call to the Poll smart contract using the `hasVoted(address)bool` ABI method.
483
+ *
484
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
485
+ *
486
+ * @param params The params for the smart contract call
487
+ * @returns The call transaction
488
+ */
489
+ hasVoted: (params) => {
490
+ return this.appClient.createTransaction.call(PollParamsFactory.hasVoted(params));
491
+ },
492
+ /**
493
+ * Makes a call to the Poll smart contract using the `updateAkitaDAO(uint64)void` ABI method.
494
+ *
495
+ * @param params The params for the smart contract call
496
+ * @returns The call transaction
497
+ */
498
+ updateAkitaDao: (params) => {
499
+ return this.appClient.createTransaction.call(PollParamsFactory.updateAkitaDao(params));
500
+ },
501
+ /**
502
+ * Makes a call to the Poll smart contract using the `opUp()void` ABI method.
503
+ *
504
+ * @param params The params for the smart contract call
505
+ * @returns The call transaction
506
+ */
507
+ opUp: (params = { args: [] }) => {
508
+ return this.appClient.createTransaction.call(PollParamsFactory.opUp(params));
509
+ }
510
+ };
511
+ /**
512
+ * Send calls to the current app
513
+ */
514
+ send = {
515
+ /**
516
+ * Gets available delete methods
517
+ */
518
+ delete: {
519
+ /**
520
+ * Deletes an existing instance of the Poll smart contract using the `deleteApplication()void` ABI method.
521
+ *
522
+ * @param params The params for the smart contract call
523
+ * @returns The delete result
524
+ */
525
+ deleteApplication: async (params = { args: [] }) => {
526
+ const result = await this.appClient.send.delete(PollParamsFactory.delete.deleteApplication(params));
527
+ return { ...result, return: result.return };
528
+ }
529
+ },
530
+ /**
531
+ * Makes a clear_state call to an existing instance of the Poll smart contract.
532
+ *
533
+ * @param params The params for the bare (raw) call
534
+ * @returns The clearState result
535
+ */
536
+ clearState: (params) => {
537
+ return this.appClient.send.bare.clearState(params);
538
+ },
539
+ /**
540
+ * Makes a call to the Poll smart contract using the `deleteBoxes(address[])void` ABI method.
541
+ *
542
+ * @param params The params for the smart contract call
543
+ * @returns The call result
544
+ */
545
+ deleteBoxes: async (params) => {
546
+ const result = await this.appClient.send.call(PollParamsFactory.deleteBoxes(params));
547
+ return { ...result, return: result.return };
548
+ },
549
+ /**
550
+ * Makes a call to the Poll smart contract using the `gatedVote(pay,appl,uint64[])void` ABI method.
551
+ *
552
+ * @param params The params for the smart contract call
553
+ * @returns The call result
554
+ */
555
+ gatedVote: async (params) => {
556
+ const result = await this.appClient.send.call(PollParamsFactory.gatedVote(params));
557
+ return { ...result, return: result.return };
558
+ },
559
+ /**
560
+ * Makes a call to the Poll smart contract using the `vote(pay,uint64[])void` ABI method.
561
+ *
562
+ * @param params The params for the smart contract call
563
+ * @returns The call result
564
+ */
565
+ vote: async (params) => {
566
+ const result = await this.appClient.send.call(PollParamsFactory.vote(params));
567
+ return { ...result, return: result.return };
568
+ },
569
+ /**
570
+ * Makes a call to the Poll smart contract using the `hasVoted(address)bool` ABI method.
571
+ *
572
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
573
+ *
574
+ * @param params The params for the smart contract call
575
+ * @returns The call result
576
+ */
577
+ hasVoted: async (params) => {
578
+ const result = await this.appClient.send.call(PollParamsFactory.hasVoted(params));
579
+ return { ...result, return: result.return };
580
+ },
581
+ /**
582
+ * Makes a call to the Poll smart contract using the `updateAkitaDAO(uint64)void` ABI method.
583
+ *
584
+ * @param params The params for the smart contract call
585
+ * @returns The call result
586
+ */
587
+ updateAkitaDao: async (params) => {
588
+ const result = await this.appClient.send.call(PollParamsFactory.updateAkitaDao(params));
589
+ return { ...result, return: result.return };
590
+ },
591
+ /**
592
+ * Makes a call to the Poll smart contract using the `opUp()void` ABI method.
593
+ *
594
+ * @param params The params for the smart contract call
595
+ * @returns The call result
596
+ */
597
+ opUp: async (params = { args: [] }) => {
598
+ const result = await this.appClient.send.call(PollParamsFactory.opUp(params));
599
+ return { ...result, return: result.return };
600
+ }
601
+ };
602
+ /**
603
+ * Clone this app client with different params
604
+ *
605
+ * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.
606
+ * @returns A new app client with the altered params
607
+ */
608
+ clone(params) {
609
+ return new _PollClient(this.appClient.clone(params));
610
+ }
611
+ /**
612
+ * Makes a readonly (simulated) call to the Poll smart contract using the `hasVoted(address)bool` ABI method.
613
+ *
614
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
615
+ *
616
+ * @param params The params for the smart contract call
617
+ * @returns The call result
618
+ */
619
+ async hasVoted(params) {
620
+ const result = await this.appClient.send.call(PollParamsFactory.hasVoted(params));
621
+ return result.return;
622
+ }
623
+ /**
624
+ * Methods to access state for the current Poll app
625
+ */
626
+ state = {
627
+ /**
628
+ * Methods to access global state for the current Poll app
629
+ */
630
+ global: {
631
+ /**
632
+ * Get all current keyed values from global state
633
+ */
634
+ getAll: async () => {
635
+ const result = await this.appClient.state.global.getAll();
636
+ return {
637
+ type: result.type,
638
+ gateId: result.gateID,
639
+ endTime: result.endTime,
640
+ optionCount: result.optionCount,
641
+ maxSelected: result.maxSelected,
642
+ boxCount: result.boxCount,
643
+ funder: result.funder,
644
+ question: result.question,
645
+ optionOne: result.optionOne,
646
+ optionTwo: result.optionTwo,
647
+ optionThree: result.optionThree,
648
+ optionFour: result.optionFour,
649
+ optionFive: result.optionFive,
650
+ votesOne: result.votesOne,
651
+ votesTwo: result.votesTwo,
652
+ votesThree: result.votesThree,
653
+ votesFour: result.votesFour,
654
+ votesFive: result.votesFive,
655
+ version: result.version,
656
+ akitaDao: result.akitaDAO
657
+ };
658
+ },
659
+ /**
660
+ * Get the current value of the type key in global state
661
+ */
662
+ type: async () => {
663
+ return await this.appClient.state.global.getValue("type");
664
+ },
665
+ /**
666
+ * Get the current value of the gateID key in global state
667
+ */
668
+ gateId: async () => {
669
+ return await this.appClient.state.global.getValue("gateID");
670
+ },
671
+ /**
672
+ * Get the current value of the endTime key in global state
673
+ */
674
+ endTime: async () => {
675
+ return await this.appClient.state.global.getValue("endTime");
676
+ },
677
+ /**
678
+ * Get the current value of the optionCount key in global state
679
+ */
680
+ optionCount: async () => {
681
+ return await this.appClient.state.global.getValue("optionCount");
682
+ },
683
+ /**
684
+ * Get the current value of the maxSelected key in global state
685
+ */
686
+ maxSelected: async () => {
687
+ return await this.appClient.state.global.getValue("maxSelected");
688
+ },
689
+ /**
690
+ * Get the current value of the boxCount key in global state
691
+ */
692
+ boxCount: async () => {
693
+ return await this.appClient.state.global.getValue("boxCount");
694
+ },
695
+ /**
696
+ * Get the current value of the funder key in global state
697
+ */
698
+ funder: async () => {
699
+ return await this.appClient.state.global.getValue("funder");
700
+ },
701
+ /**
702
+ * Get the current value of the question key in global state
703
+ */
704
+ question: async () => {
705
+ return await this.appClient.state.global.getValue("question");
706
+ },
707
+ /**
708
+ * Get the current value of the optionOne key in global state
709
+ */
710
+ optionOne: async () => {
711
+ return await this.appClient.state.global.getValue("optionOne");
712
+ },
713
+ /**
714
+ * Get the current value of the optionTwo key in global state
715
+ */
716
+ optionTwo: async () => {
717
+ return await this.appClient.state.global.getValue("optionTwo");
718
+ },
719
+ /**
720
+ * Get the current value of the optionThree key in global state
721
+ */
722
+ optionThree: async () => {
723
+ return await this.appClient.state.global.getValue("optionThree");
724
+ },
725
+ /**
726
+ * Get the current value of the optionFour key in global state
727
+ */
728
+ optionFour: async () => {
729
+ return await this.appClient.state.global.getValue("optionFour");
730
+ },
731
+ /**
732
+ * Get the current value of the optionFive key in global state
733
+ */
734
+ optionFive: async () => {
735
+ return await this.appClient.state.global.getValue("optionFive");
736
+ },
737
+ /**
738
+ * Get the current value of the votesOne key in global state
739
+ */
740
+ votesOne: async () => {
741
+ return await this.appClient.state.global.getValue("votesOne");
742
+ },
743
+ /**
744
+ * Get the current value of the votesTwo key in global state
745
+ */
746
+ votesTwo: async () => {
747
+ return await this.appClient.state.global.getValue("votesTwo");
748
+ },
749
+ /**
750
+ * Get the current value of the votesThree key in global state
751
+ */
752
+ votesThree: async () => {
753
+ return await this.appClient.state.global.getValue("votesThree");
754
+ },
755
+ /**
756
+ * Get the current value of the votesFour key in global state
757
+ */
758
+ votesFour: async () => {
759
+ return await this.appClient.state.global.getValue("votesFour");
760
+ },
761
+ /**
762
+ * Get the current value of the votesFive key in global state
763
+ */
764
+ votesFive: async () => {
765
+ return await this.appClient.state.global.getValue("votesFive");
766
+ },
767
+ /**
768
+ * Get the current value of the version key in global state
769
+ */
770
+ version: async () => {
771
+ return await this.appClient.state.global.getValue("version");
772
+ },
773
+ /**
774
+ * Get the current value of the akitaDAO key in global state
775
+ */
776
+ akitaDao: async () => {
777
+ return await this.appClient.state.global.getValue("akitaDAO");
778
+ }
779
+ },
780
+ /**
781
+ * Methods to access box state for the current Poll app
782
+ */
783
+ box: {
784
+ /**
785
+ * Get all current keyed values from box state
786
+ */
787
+ getAll: async () => {
788
+ const result = await this.appClient.state.box.getAll();
789
+ return {};
790
+ },
791
+ /**
792
+ * Get values from the votes map in box state
793
+ */
794
+ votes: {
795
+ /**
796
+ * Get all current values of the votes map in box state
797
+ */
798
+ getMap: async () => {
799
+ return await this.appClient.state.box.getMap("votes");
800
+ },
801
+ /**
802
+ * Get a current value of the votes map by key from box state
803
+ */
804
+ value: async (key) => {
805
+ return await this.appClient.state.box.getMapValue("votes", key);
806
+ }
807
+ }
808
+ }
809
+ };
810
+ newGroup(composerConfig) {
811
+ const client = this;
812
+ const composer = this.algorand.newGroup(composerConfig);
813
+ let promiseChain = Promise.resolve();
814
+ return {
815
+ /**
816
+ * Add a deleteBoxes(address[])void method call against the Poll contract
817
+ */
818
+ deleteBoxes(params) {
819
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxes(params)));
820
+ return this;
821
+ },
822
+ /**
823
+ * Add a gatedVote(pay,appl,uint64[])void method call against the Poll contract
824
+ */
825
+ gatedVote(params) {
826
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gatedVote(params)));
827
+ return this;
828
+ },
829
+ /**
830
+ * Add a vote(pay,uint64[])void method call against the Poll contract
831
+ */
832
+ vote(params) {
833
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.vote(params)));
834
+ return this;
835
+ },
836
+ /**
837
+ * Add a hasVoted(address)bool method call against the Poll contract
838
+ */
839
+ hasVoted(params) {
840
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hasVoted(params)));
841
+ return this;
842
+ },
843
+ /**
844
+ * Add a updateAkitaDAO(uint64)void method call against the Poll contract
845
+ */
846
+ updateAkitaDao(params) {
847
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)));
848
+ return this;
849
+ },
850
+ /**
851
+ * Add a opUp()void method call against the Poll contract
852
+ */
853
+ opUp(params) {
854
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)));
855
+ return this;
856
+ },
857
+ get delete() {
858
+ return {
859
+ deleteApplication: (params) => {
860
+ promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.deleteApplication(params)));
861
+ return this;
862
+ }
863
+ };
864
+ },
865
+ /**
866
+ * Add a clear state call to the Poll contract
867
+ */
868
+ clearState(params) {
869
+ promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)));
870
+ return this;
871
+ },
872
+ addTransaction(txn, signer) {
873
+ promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer));
874
+ return this;
875
+ },
876
+ async composer() {
877
+ await promiseChain;
878
+ return composer;
879
+ },
880
+ async simulate(options) {
881
+ var _a;
882
+ await promiseChain;
883
+ const result = await (!options ? composer.simulate() : composer.simulate(options));
884
+ return {
885
+ ...result,
886
+ returns: (_a = result.returns) == null ? void 0 : _a.map((val) => val.returnValue)
887
+ };
888
+ },
889
+ async send(params) {
890
+ var _a;
891
+ await promiseChain;
892
+ const result = await composer.send(params);
893
+ return {
894
+ ...result,
895
+ returns: (_a = result.returns) == null ? void 0 : _a.map((val) => val.returnValue)
896
+ };
897
+ }
898
+ };
899
+ }
900
+ };
901
+
902
+ // src/poll/types.ts
903
+ var PollTypeEnum = /* @__PURE__ */ ((PollTypeEnum2) => {
904
+ PollTypeEnum2[PollTypeEnum2["SingleChoice"] = 10] = "SingleChoice";
905
+ PollTypeEnum2[PollTypeEnum2["MultipleChoice"] = 20] = "MultipleChoice";
906
+ PollTypeEnum2[PollTypeEnum2["SingleChoiceImpact"] = 30] = "SingleChoiceImpact";
907
+ PollTypeEnum2[PollTypeEnum2["MultipleChoiceImpact"] = 40] = "MultipleChoiceImpact";
908
+ return PollTypeEnum2;
909
+ })(PollTypeEnum || {});
910
+ var VOTES_MBR = 15300n;
911
+
912
+ // src/poll/errors.ts
913
+ var POLL_ERROR_MESSAGES = {
914
+ // --- Poll configuration -------------------------------------------------
915
+ IETM: "End time must be in the future",
916
+ IPTY: "Invalid poll type",
917
+ IOPC: "Invalid number of options, must be between 2 and 5",
918
+ IMXS: "Invalid maximum selection",
919
+ // --- Poll lifecycle -----------------------------------------------------
920
+ PEND: "Poll has ended",
921
+ PACT: "Poll is still active",
922
+ NAPL: "App is not a poll created by this factory",
923
+ SHVB: "Poll still has vote boxes",
924
+ MCFF: "Method must be called from poll factory",
925
+ // --- Voting -------------------------------------------------------------
926
+ AVOT: "User has already voted",
927
+ IVOT: "Invalid vote args",
928
+ IVCT: "Invalid number of vote args",
929
+ IVOP: "Invalid vote option",
930
+ NVOT: "User has not voted",
931
+ // --- Poll plugin --------------------------------------------------------
932
+ NPLF: "Creator is not the poll factory"
933
+ };
934
+ var translatePollError = makeErrorTranslator(POLL_ERROR_MESSAGES);
935
+
936
+ // src/poll/factory.ts
937
+ import { microAlgo } from "@algorandfoundation/algokit-utils";
938
+ import { ABIMethod } from "@algorandfoundation/algokit-utils/abi";
939
+
940
+ // src/generated/PollFactoryClient.ts
941
+ import { ABIStructType as ABIStructType2, getStructValueFromTupleValue as getStructValueFromTupleValue2 } from "@algorandfoundation/algokit-utils/abi";
942
+ import { AppClient as _AppClient2 } from "@algorandfoundation/algokit-utils/app-client";
943
+ import { AppFactory as _AppFactory2 } from "@algorandfoundation/algokit-utils/app-factory";
944
+ var APP_SPEC2 = { "name": "PollFactory", "structs": { "EscrowConfig": [{ "name": "name", "type": "string" }, { "name": "app", "type": "uint64" }] }, "methods": [{ "name": "create", "args": [{ "type": "string", "name": "version" }, { "type": "string", "name": "childVersion" }, { "type": "uint64", "name": "akitaDAO" }, { "type": "(string,uint64)", "struct": "EscrowConfig", "name": "akitaDAOEscrow" }], "returns": { "type": "void" }, "actions": { "create": ["NoOp"], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "new", "args": [{ "type": "pay", "name": "payment" }, { "type": "uint8", "name": "type" }, { "type": "uint64", "name": "endTime" }, { "type": "uint64", "name": "maxSelected" }, { "type": "string", "name": "question" }, { "type": "string[]", "name": "options" }, { "type": "uint64", "name": "gateID" }], "returns": { "type": "uint64" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deletePoll", "args": [{ "type": "uint64", "name": "appId" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "newPollCost", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "initBoxedContract", "args": [{ "type": "string", "name": "version" }, { "type": "uint64", "name": "size" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "loadBoxedContract", "args": [{ "type": "uint64", "name": "offset" }, { "type": "byte[]", "name": "data" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deleteBoxedContract", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "optIn", "args": [{ "type": "pay", "name": "payment", "desc": "The payment transaction covering MBR for all opt-ins" }, { "type": "uint64", "name": "asset", "desc": "The asset to opt into" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "optIn opts this contract into `asset`. When this contract has a\nnamed escrow configured (`akitaDAOEscrow.value.name !== ''`), it\nalso opts the escrow and every revenue-split recipient in through\nthe revenue-manager plugin \u2014 so downstream methods (subscribe,\nlist, etc.) can transfer to the escrow without doing the plugin-\nrekey dance mid-group.\n\nPayment must cover:\n - this contract's own opt-in (1 \xD7 assetOptInMinBalance), plus\n - each downstream opt-in the escrow still needs.\n`splitOptInCount` returns 0 once the escrow is already opted in, so\nthe charge collapses to just 1 \xD7 assetOptInMinBalance on repeat\ncalls and the escrow branch becomes a no-op.", "events": [], "recommendations": {} }, { "name": "optInCost", "args": [{ "type": "uint64", "name": "asset" }], "returns": { "type": "uint64" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "updateAkitaDAOEscrow", "args": [{ "type": "(string,uint64)", "struct": "EscrowConfig", "name": "config" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "update", "args": [{ "type": "string", "name": "newVersion" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["UpdateApplication"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "updateAkitaDAO", "args": [{ "type": "uint64", "name": "akitaDAO" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "opUp", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 8, "bytes": 56 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "childContractVersion": { "keyType": "AVMString", "valueType": "AVMString", "key": "Y2hpbGRfY29udHJhY3RfdmVyc2lvbg==", "desc": "the current version of the child contract" }, "akitaDAOEscrow": { "keyType": "AVMString", "valueType": "EscrowConfig", "key": "YWtpdGFfZXNjcm93", "desc": "the named DAO escrow this contract routes fees to (name + app)" }, "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVyc2lvbg==", "desc": "the current version of the contract" }, "akitaDAO": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWtpdGFfZGFv", "desc": "the app ID of the Akita DAO" } }, "local": {}, "box": { "boxedContract": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "YmM=" } } }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [3263], "errorMessage": "Bytes has valid prefix" }, { "pc": [2970], "errorMessage": "ERR:CNST" }, { "pc": [2951], "errorMessage": "ERR:ICOR" }, { "pc": [519, 539], "errorMessage": "ERR:IPAY" }, { "pc": [3110], "errorMessage": "ERR:IPMA" }, { "pc": [3083], "errorMessage": "ERR:IPMR" }, { "pc": [3637], "errorMessage": "ERR:IUPG" }, { "pc": [2693], "errorMessage": "ERR:NAPL" }, { "pc": [2813, 2839, 3001, 3566, 3608, 3672], "errorMessage": "ERR:NDAO" }, { "pc": [3298], "errorMessage": "ERR:NESC" }, { "pc": [3323], "errorMessage": "ERR:WESC" }, { "pc": [2641, 2675, 2832, 2994, 3057, 3388, 3404, 3499, 3559, 3601, 3665], "errorMessage": "application exists" }, { "pc": [544, 2826, 2988, 3047, 3051, 3156, 3188, 3380, 3489, 3494, 3553, 3595, 3612, 3659], "errorMessage": "check GlobalState exists" }, { "pc": [461], "errorMessage": "invalid array encoding" }, { "pc": [278, 292, 308, 349, 418, 431, 475, 2771, 2862, 3266, 3542, 3579], "errorMessage": "invalid array length header" }, { "pc": [299, 315, 424, 2778, 2869, 3586], "errorMessage": "invalid number of bytes for arc4.dynamic_array<arc4.uint8>" }, { "pc": [3275], "errorMessage": "invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::EscrowInfo>" }, { "pc": [495], "errorMessage": "invalid number of bytes for arc4.dynamic_array<string>" }, { "pc": [326, 403, 411, 505, 2670, 2789, 2854, 3032, 3484, 3652], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [395], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [354, 3547], "errorMessage": "invalid number of bytes for smart_contracts/utils/base-contracts/base.ts::EscrowConfig" }, { "pc": [341, 3534], "errorMessage": "invalid tail pointer at index 0 of ((len+utf8[]),uint64)" }, { "pc": [469], "errorMessage": "invalid tail pointer for (len+(len+utf8[])[])" }, { "pc": [336, 3529], "errorMessage": "invalid tuple encoding" }, { "pc": [387, 3024], "errorMessage": "transaction type is pay" }], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDIgOCA4NjM1MDAKICAgIGJ5dGVjYmxvY2sgImFraXRhX2RhbyIgIndhbGxldCIgImJjIiAiRVJSOk5EQU8iICJha2l0YV9lc2Nyb3ciIDB4MTUxZjdjNzUgMHhjNTNiMzJjYyAidmVyc2lvbiIgImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iICJFUlI6SVBBWSIgInBhbCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czoxMi0xOAogICAgLy8gQGNvbnRyYWN0KHsKICAgIC8vICAgc3RhdGVUb3RhbHM6IHsKICAgIC8vICAgICBnbG9iYWxCeXRlczogRmFjdG9yeUdsb2JhbFN0YXRlTWF4Qnl0ZXMsCiAgICAvLyAgICAgZ2xvYmFsVWludHM6IEZhY3RvcnlHbG9iYWxTdGF0ZU1heFVpbnRzCiAgICAvLyAgIH0KICAgIC8vIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgUG9sbEZhY3RvcnkgZXh0ZW5kcyBGYWN0b3J5Q29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4ZWE5MTgwZGQgLy8gbWV0aG9kICJ1cGRhdGUoc3RyaW5nKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3VwZGF0ZV9yb3V0ZUAyCgptYWluX3N3aXRjaF9jYXNlX25leHRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czoxMi0xOAogICAgLy8gQGNvbnRyYWN0KHsKICAgIC8vICAgc3RhdGVUb3RhbHM6IHsKICAgIC8vICAgICBnbG9iYWxCeXRlczogRmFjdG9yeUdsb2JhbFN0YXRlTWF4Qnl0ZXMsCiAgICAvLyAgICAgZ2xvYmFsVWludHM6IEZhY3RvcnlHbG9iYWxTdGF0ZU1heFVpbnRzCiAgICAvLyAgIH0KICAgIC8vIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgUG9sbEZhY3RvcnkgZXh0ZW5kcyBGYWN0b3J5Q29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAxNwogICAgcHVzaGJ5dGVzcyAweDExOWJjNjk4IDB4NDRkMTNhNzQgMHg4MzY2MTcwMyAvLyBtZXRob2QgIm5ldyhwYXksdWludDgsdWludDY0LHVpbnQ2NCxzdHJpbmcsc3RyaW5nW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlUG9sbCh1aW50NjQpdm9pZCIsIG1ldGhvZCAibmV3UG9sbENvc3QoKXVpbnQ2NCIKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJpbml0Qm94ZWRDb250cmFjdChzdHJpbmcsdWludDY0KXZvaWQiCiAgICBwdXNoYnl0ZXNzIDB4ZGNhMmQ4NjIgMHhkMzQ2YjFhNCAweDM5NGVhZWIyIDB4MzNmNzg4MDggMHhhZTg0Y2JkOCAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgLy8gbWV0aG9kICJsb2FkQm94ZWRDb250cmFjdCh1aW50NjQsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImRlbGV0ZUJveGVkQ29udHJhY3QoKXZvaWQiLCBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0SW5Db3N0KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPRXNjcm93KChzdHJpbmcsdWludDY0KSl2b2lkIiwgbWV0aG9kICJ1cGRhdGVBa2l0YURBTyh1aW50NjQpdm9pZCIsIG1ldGhvZCAib3BVcCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG5ldyBkZWxldGVQb2xsIG5ld1BvbGxDb3N0IGluaXRCb3hlZENvbnRyYWN0IGxvYWRCb3hlZENvbnRyYWN0IGRlbGV0ZUJveGVkQ29udHJhY3Qgb3B0SW4gb3B0SW5Db3N0IHVwZGF0ZUFraXRhREFPRXNjcm93IHVwZGF0ZUFraXRhREFPIG1haW5fb3BVcF9yb3V0ZUAxNQogICAgZXJyCgptYWluX29wVXBfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0MQogICAgLy8gb3BVcCgpOiB2b2lkIHsgfQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfTm9PcEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czoxMi0xOAogICAgLy8gQGNvbnRyYWN0KHsKICAgIC8vICAgc3RhdGVUb3RhbHM6IHsKICAgIC8vICAgICBnbG9iYWxCeXRlczogRmFjdG9yeUdsb2JhbFN0YXRlTWF4Qnl0ZXMsCiAgICAvLyAgICAgZ2xvYmFsVWludHM6IEZhY3RvcnlHbG9iYWxTdGF0ZU1heFVpbnRzCiAgICAvLyAgIH0KICAgIC8vIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgUG9sbEZhY3RvcnkgZXh0ZW5kcyBGYWN0b3J5Q29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4ODExNTM2MjggLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nLHN0cmluZyx1aW50NjQsKHN0cmluZyx1aW50NjQpKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKbWFpbl91cGRhdGVfcm91dGVAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ2CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHVwZGF0ZQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnNwbGl0T3B0SW5Db3VudChha2l0YURBTzogdWludDY0LCBlc2Nyb3c6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB1aW50NjQ6CnNwbGl0T3B0SW5Db3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjIxCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gc3BsaXRPcHRJbkNvdW50KGFraXRhREFPOiBBcHBsaWNhdGlvbiwgZXNjcm93OiBBY2NvdW50LCBhc3NldDogQXNzZXQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyMgogICAgLy8gbGV0IGNvdW50OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjQKICAgIC8vIGlmICghZXNjcm93LmlzT3B0ZWRJbihhc3NldCkpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgYm56IHNwbGl0T3B0SW5Db3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTAzCiAgICAvLyBjb25zdCBbc3BsaXRzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzUmV2ZW51ZVNwbGl0cykpCiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hieXRlcyAicmV2ZW51ZV9zcGxpdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyOAogICAgLy8gY291bnQgKz0gc3BsaXRzLmxlbmd0aAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI1CiAgICAvLyBjb3VudCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjgKICAgIC8vIGNvdW50ICs9IHNwbGl0cy5sZW5ndGgKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjMxCiAgICAvLyByZXR1cm4gY291bnQKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6OlBvbGxGYWN0b3J5LmNyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czoyMAogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAxMAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAwIG9mICgobGVuK3V0ZjhbXSksdWludDY0KQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkVzY3Jvd0NvbmZpZwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjUKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIGJ5dGVjIDcgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6MjIKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IHZlcnNpb24KICAgIHVuY292ZXIgNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM0CiAgICAvLyBjaGlsZENvbnRyYWN0VmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEJhc2VGYWN0b3J5R2xvYmFsU3RhdGVLZXlDaGlsZENvbnRyYWN0VmVyc2lvbiB9KQogICAgYnl0ZWMgOCAvLyAiY2hpbGRfY29udHJhY3RfdmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czoyMwogICAgLy8gdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSA9IGNoaWxkVmVyc2lvbgogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6MjQKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWMgNCAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjI1CiAgICAvLyB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlID0gY2xvbmUoYWtpdGFEQU9Fc2Nyb3cpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjIwCiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo6UG9sbEZhY3RvcnkubmV3W3JvdXRpbmddKCkgLT4gdm9pZDoKbmV3OgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjI4LTM2CiAgICAvLyBuZXcoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgdHlwZTogUG9sbFR5cGUsCiAgICAvLyAgIGVuZFRpbWU6IHVpbnQ2NCwKICAgIC8vICAgbWF4U2VsZWN0ZWQ6IHVpbnQ2NCwKICAgIC8vICAgcXVlc3Rpb246IHN0cmluZywKICAgIC8vICAgb3B0aW9uczogc3RyaW5nW10sCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgbGVuCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDAKCm5ld19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6MjgtMzYKICAgIC8vIG5ldygKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICB0eXBlOiBQb2xsVHlwZSwKICAgIC8vICAgZW5kVGltZTogdWludDY0LAogICAgLy8gICBtYXhTZWxlY3RlZDogdWludDY0LAogICAgLy8gICBxdWVzdGlvbjogc3RyaW5nLAogICAgLy8gICBvcHRpb25zOiBzdHJpbmdbXSwKICAgIC8vICAgZ2F0ZUlEOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgZHVwCiAgICBkaWcgNQogICAgPAogICAgYnogbmV3X2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKGxlbit1dGY4W10pW10pCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBuZXdfZm9yX2hlYWRlckAxCgpuZXdfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6MjgtMzYKICAgIC8vIG5ldygKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICB0eXBlOiBQb2xsVHlwZSwKICAgIC8vICAgZW5kVGltZTogdWludDY0LAogICAgLy8gICBtYXhTZWxlY3RlZDogdWludDY0LAogICAgLy8gICBxdWVzdGlvbjogc3RyaW5nLAogICAgLy8gICBvcHRpb25zOiBzdHJpbmdbXSwKICAgIC8vICAgZ2F0ZUlEOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHN0cmluZz4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgYnVyeSAxNAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo0MAogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDEwCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogbmV3X2FmdGVyX2Fzc2VydEA3CiAgICBieXRlYyA5IC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpuZXdfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NDEKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LmFtb3VudCA9PT0gdGhpcy5uZXdQb2xsQ29zdCgpLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDEwCiAgICBndHhucyBBbW91bnQKICAgIGR1cAogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjg3LTg5CiAgICAvLyBNSU5fUFJPR1JBTV9QQUdFUyArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9VSU5UX0NPU1QgKiBwb2xsLmdsb2JhbFVpbnRzKSArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9CWVRFU19DT1NUICogcG9sbC5nbG9iYWxCeXRlcykgKwogICAgaW50YyA0IC8vIDg2MzUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjkwCiAgICAvLyBHbG9iYWwubWluQmFsYW5jZQogICAgZ2xvYmFsIE1pbkJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo4Ny05MAogICAgLy8gTUlOX1BST0dSQU1fUEFHRVMgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfVUlOVF9DT1NUICogcG9sbC5nbG9iYWxVaW50cykgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIHBvbGwuZ2xvYmFsQnl0ZXMpICsKICAgIC8vIEdsb2JhbC5taW5CYWxhbmNlCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NDEKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LmFtb3VudCA9PT0gdGhpcy5uZXdQb2xsQ29zdCgpLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgPT0KICAgIGJueiBuZXdfYWZ0ZXJfYXNzZXJ0QDkKICAgIGJ5dGVjIDkgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCm5ld19hZnRlcl9hc3NlcnRAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo0My01NQogICAgLy8gY29uc3QgbWludCA9IHBvbGwuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLmlkLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIGVuZFRpbWUsCiAgICAvLyAgICAgICBtYXhTZWxlY3RlZCwKICAgIC8vICAgICAgIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogcGF5bWVudC5hbW91bnQgfSwKICAgIC8vICAgICAgIHF1ZXN0aW9uLAogICAgLy8gICAgICAgb3B0aW9ucywKICAgIC8vICAgICAgIGdhdGVJRAogICAgLy8gICAgIF0sCiAgICAvLyAgIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NDYKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NDYKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjUwCiAgICAvLyB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHBheW1lbnQuYW1vdW50IH0sCiAgICBkaWcgMTEKICAgIGd0eG5zIFNlbmRlcgogICAgZGlnIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czozOAogICAgLy8gY29uc3QgcG9sbCA9IGNvbXBpbGVBcmM0KFBvbGwpCiAgICBwdXNoaW50IDkKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDExCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKICAgIHB1c2hieXRlcyBiYXNlNjQoQzRFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoQ3lBRkFBRUNDTVIzSmhRSlltOTRYMk52ZFc1MENYWnZkR1Z6WDI5dVpRbDJiM1JsYzE5MGQyOExkbTkwWlhOZmRHaHlaV1VLZG05MFpYTmZabTkxY2dwMmIzUmxjMTltYVhabENXRnJhWFJoWDJSaGJ3UjBlWEJsQ0dWdVpGOTBhVzFsQ0VWU1VqcEpVRUZaQjJkaGRHVmZhV1FNYjNCMGFXOXVYMk52ZFc1MENFVlNVanBKVms5UURHMWhlRjl6Wld4bFkzUmxaQWhGVWxJNlVFRkRWQWhGVWxJNlVFVk9SQWhGVWxJNlFWWlBWQWhGVWxJNlNWWlBWQVFWSDN4MUNFVlNVanBKVmtOVU1SaEFBQkVwSW1jcUltY3JJbWNuQkNKbkp3VWlaNEFFSklmRExEWWFBSTRCQUVzeEdSUkVNUmhCQURTQ0JnVGhRWkNBQkZ2UGtRQUUzVENjZXdSYWYwa3lCRFBwTEpRRWhVM3Q0RFlhQUk0R0FqNERDd1A2QklBRW1nQUJBQ05EZ0FTVnF2WHJOaG9BamdFQUl3QXhHWUVGRWpFWUVFUkNBcmFLQWdHTC9sY0NBSXYvSkF0TEFVeFpTbGtrQ0ZpSmdBQTJHZ0ZKRlNVU1JCYzJHZ0pKRlNNU1JEWWFBMGtWSlJKRUZ6WWFCRWtWSlJKRUZ6WWFCVWtWZ1NnU1JEWWFCa2tpV1NRSVN3RVZFa1JYQWdBMkdnZEhBaUpaU1U0Q0pBdE1TUlZNVndJQUlrbExCUXhCQUNSSEFpUUxTd05KVHdKWlNVc0hTVTRFRWtSTEFSVlNJbGtrQ0FoRkJTTUlSUUZDLzlWTEF5UUlTd01TUkRZYUNFa1ZKUkpFRjBVTk1nMUFBQXlBQ0VWU1VqcENSRVZRc0FBeUIwc0tERUFBRElBSVJWSlNPa2xGVkUyd0FFc0tGNEVvREVBQURJQUlSVkpTT2tsUVZGbXdBQ2NHU3d4bkp3ZExDMmNuQ2tzTlp5Y0lTd3BuZ0FabWRXNWtaWEpMQ0dlQUNIRjFaWE4wYVc5dVN3ZG5Td1FrRDBFQkNrc0VnUVVPUVFFQ0kwQUFESUFJUlZKU09rbFBVRU93QUVzS2dBRVVFa0FBQ1VzS2dBRW9Fa0VBSmtzSUpBOUJBTlZMQkNNSlN3a1BRUURMSTBBQURJQUlSVkpTT2tsTldGT3dBQ2NOU3dsbkp3dExCVWxPQW1jb0ltZEpSRXNHU1U0Q0lvaitoMWNDQUlBS2IzQjBhVzl1WDI5dVpVeG5JMHNCREVSTUk0aitiRmNDQUlBS2IzQjBhVzl1WDNSM2IweG5nUU1QUVFBZUpFc0ZERVJMQlNTSS9rcFhBZ0NBREc5d2RHbHZibDkwYUhKbFpVeG5Td1NCQkE5QkFCK0JBMHNGREVSTEJZRURpUDRpVndJQWdBdHZjSFJwYjI1ZlptOTFja3huU3dTQkJROUJBQitCQkVzRkRFUkxCWUVFaVAzN1Z3SUFnQXR2Y0hScGIyNWZabWwyWlV4bkkwTWlRdjh5SWtMKyt5S0FBRFlhQVVjQ0lsbEpUZ0tCSUFza0NFd1ZFa1F5QnlJbkNHVkVEVUFBQkNjT3NBQWlSUU5MQWtzQkRFRUFZMHNCVndJQVN3T0JJQXVCSUZoSlJRVzlSUUZBQUF5QUNFVlNVanBPVms5VXNBQkxBMG04U0xHQUdFMUNVaUJ5WldaMWJtUWdabTl5SUhCdmJHd2dkbTkwWmJJRklRU3lDTElISTdJUUlySUJzeUlvWlVRakNTaE1aMHNDSXdoRkEwTC9sU05ETVFBeUNSSkFBQXlBQ0VWU1VqcE5RMFpHc0FBeUJ5SW5DR1ZFRFVBQUJDY09zQUFpS0dWRVFRQU1nQWhGVWxJNlUwaFdRckFBSTBNaWdBQXhGaVFKU1RnUUl4SkVNUllqQ1VrNEVJRUdFa1EyR2dGSEFpSlpTVTRDSlFza0NFd1ZFa1F5QnlJbkNHVkVEa0FBQkNjUHNBQXhBTDFGQVVFQUJDY1FzQUJKZ1FVT1FRQ2ZTVUVBbXlOQUFBUW5FYkFBSWljR1pVUXhBRVVISWljS1pVeEZCMFJMQXpnWVRJQURZV0ZzWlVpQktGc1NRUUJyU3dJNEdVQUFaRXNDT0J1QkJCSkJBRnBMQWlMQ0dvQUVRNUltVlJKQkFFdExBaVBDR2tzR0VrRUFRRXNDSk1JYVN3VVdFa0VBTkNOQUFBeUFDRVZTVWpwR1IxUkZzQUJMQXpnSE1nb1NRQUFFSndtd0FFc0RPQWdoQkJKQUFBUW5DYkFBU3dHSUFOOUlJME1pUXYvSklrTC9ZakVXSXdsSk9CQWpFa1EyR2dGSEFpSlpTVTRDSlFza0NFd1ZFa1F5QnlJbkNHVkVEa0FBQkNjUHNBQXhBTDFGQVVFQUJDY1FzQUJKZ1FVT1FRQkVTVUVBUUNOQUFBUW5FYkFBSWljS1pVUkJBQXlBQ0VWU1VqcElSMVJGc0FCTEFqZ0hNZ29TUUFBRUp3bXdBRXNDT0FnaEJCSkFBQVFuQ2JBQVN3R0lBRlZJSTBNaVF2KzlOaG9CU1JXQklCSkV2VVVCZ0FFQUlrOENWQ2NTVEZDd0kwTTJHZ0ZKRlNVU1JCY3hBQ0luQm1WRWdBWjNZV3hzWlhSbFNISUlSQkpBQUF5QUNFVlNVanBPUkVGUHNBQW5Ca3NCWnlORGlnRUJJb0FBUndVaklpY0haVVNBQVI0U1FBQU1JaWNIWlVTQUFTZ1NRUUE5SWljR1pVUXhBTEZNZ0FOellXeGxTSUVRVzdJWWdBVFZkTHNRc2hxeUdvRUdzaEFpc2dHenRENUpWd1FBVEZjQUJDY1NFa1JKRlNVU1JCZU1CeUluQjJWRWdBRUtFa0FBRENJbkIyVkVnQUVlRWtFQW00di9JbGtqRWtBQUJDY1RzQUNML3lSYlNZd0dJaWNMWlVRakNRNUFBQVFuRExBQWl3WkFBQjBpS1dWRWl3Y0lLVXhuTVFBaXVVZ2lLR1ZFSXdnb1RHZUwvNHdBaVlzR0l4SkJBQTBpS21WRWl3Y0lLa3huUXYvWml3WWtFa0VBRFNJclpVU0xCd2dyVEdkQy84V0xCb0VERWtFQUR5SW5CR1ZFaXdjSUp3Uk1aMEwvcm9zR2dRUVNRZittSWljRlpVU0xCd2duQlV4blF2K1hpLzhpV1VtTUFTSW5EV1ZFRGtBQUJDY1RzQUFpakFLTEFvc0JERUgvZUl2L1Z3SUFTWXdBaXdJbEMxdEpqQVVpSnd0bFJDTUpEa0FBQkNjTXNBQ0xBaU1JU1l3RGpBU0xCSXNCREVFQUc0c0VKUXVMQUV4Yml3VVRRQUFFSnd5d0FJc0VJd2lNQkVMLzNZc0ZRQUFSSWlsbFJJc0hDQ2xNWjRzRGpBSkMvNWVMQlNNU1FRQU5JaXBsUklzSENDcE1aMEwvNVlzRkpCSkJBQTBpSzJWRWl3Y0lLMHhuUXYvUml3V0JBeEpCQUE4aUp3UmxSSXNIQ0NjRVRHZEMvN3FMQllFRUVrSC9zaUluQldWRWl3Y0lKd1ZNWjBML293PT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NDMtNTUKICAgIC8vIGNvbnN0IG1pbnQgPSBwb2xsLmNhbGwKICAgIC8vICAgLmNyZWF0ZSh7CiAgICAvLyAgICAgYXJnczogWwogICAgLy8gICAgICAgdGhpcy5ha2l0YURBTy52YWx1ZS5pZCwKICAgIC8vICAgICAgIHR5cGUsCiAgICAvLyAgICAgICBlbmRUaW1lLAogICAgLy8gICAgICAgbWF4U2VsZWN0ZWQsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHBheW1lbnQuYW1vdW50IH0sCiAgICAvLyAgICAgICBxdWVzdGlvbiwKICAgIC8vICAgICAgIG9wdGlvbnMsCiAgICAvLyAgICAgICBnYXRlSUQKICAgIC8vICAgICBdLAogICAgLy8gICB9KQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBwdXNoYnl0ZXMgMHg5NWFhZjVlYiAvLyBtZXRob2QgImNyZWF0ZSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCwoYWRkcmVzcyx1aW50NjQpLHN0cmluZyxzdHJpbmdbXSx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo0My01NwogICAgLy8gY29uc3QgbWludCA9IHBvbGwuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLmlkLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIGVuZFRpbWUsCiAgICAvLyAgICAgICBtYXhTZWxlY3RlZCwKICAgIC8vICAgICAgIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogcGF5bWVudC5hbW91bnQgfSwKICAgIC8vICAgICAgIHF1ZXN0aW9uLAogICAgLy8gICAgICAgb3B0aW9ucywKICAgIC8vICAgICAgIGdhdGVJRAogICAgLy8gICAgIF0sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5pdHhuCiAgICAvLyAgIC5jcmVhdGVkQXBwCiAgICBnaXR4biAwIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NTktNjQKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBtaW50LmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZQogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo2MQogICAgLy8gcmVjZWl2ZXI6IG1pbnQuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjYyCiAgICAvLyBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlCiAgICBnbG9iYWwgTWluQmFsYW5jZQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo1OS02MwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IG1pbnQuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NTktNjQKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBtaW50LmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZQogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6MjgtMzYKICAgIC8vIG5ldygKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICB0eXBlOiBQb2xsVHlwZSwKICAgIC8vICAgZW5kVGltZTogdWludDY0LAogICAgLy8gICBtYXhTZWxlY3RlZDogdWludDY0LAogICAgLy8gICBxdWVzdGlvbjogc3RyaW5nLAogICAgLy8gICBvcHRpb25zOiBzdHJpbmdbXSwKICAgIC8vICAgZ2F0ZUlEOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo6UG9sbEZhY3RvcnkuZGVsZXRlUG9sbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZVBvbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NjkKICAgIC8vIGRlbGV0ZVBvbGwoYXBwSWQ6IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo3MAogICAgLy8gbG9nZ2VkQXNzZXJ0KGFwcElkLmNyZWF0b3IgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX0FfUE9MTCkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGRlbGV0ZVBvbGxfYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOk5BUEwiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkFQTAoKZGVsZXRlUG9sbF9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo3MgogICAgLy8gY29uc3QgW2Z1bmRlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFwcElkLCBCeXRlcyhHbG9iYWxTdGF0ZUtleUZ1bmRlcikpCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiZnVuZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjczCiAgICAvLyBjb25zdCB7IGFjY291bnQ6IHJlY2VpdmVyLCBhbW91bnQgfSA9IGRlY29kZUFyYzQ8RnVuZGVySW5mbz4oZnVuZGVyQnl0ZXMpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgcHVzaGludCAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo3NgogICAgLy8gcG9sbC5jYWxsLmRlbGV0ZUFwcGxpY2F0aW9uKHsgYXBwSWQgfSkKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNQogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHgyNDg3YzMyYyAvLyBtZXRob2QgImRlbGV0ZUFwcGxpY2F0aW9uKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NzgtODAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo3OC03OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo3OC04MAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjY5CiAgICAvLyBkZWxldGVQb2xsKGFwcElkOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo6UG9sbEZhY3RvcnkubmV3UG9sbENvc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpuZXdQb2xsQ29zdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo4Ny04OQogICAgLy8gTUlOX1BST0dSQU1fUEFHRVMgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfVUlOVF9DT1NUICogcG9sbC5nbG9iYWxVaW50cykgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIHBvbGwuZ2xvYmFsQnl0ZXMpICsKICAgIGludGMgNCAvLyA4NjM1MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo5MAogICAgLy8gR2xvYmFsLm1pbkJhbGFuY2UKICAgIGdsb2JhbCBNaW5CYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6ODctOTAKICAgIC8vIE1JTl9QUk9HUkFNX1BBR0VTICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIHBvbGwuZ2xvYmFsVWludHMpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBwb2xsLmdsb2JhbEJ5dGVzKSArCiAgICAvLyBHbG9iYWwubWluQmFsYW5jZQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjgzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo6RmFjdG9yeUNvbnRyYWN0LmluaXRCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKaW5pdEJveGVkQ29udHJhY3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MgogICAgLy8gaW5pdEJveGVkQ29udHJhY3QodmVyc2lvbjogc3RyaW5nLCBzaXplOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozNAogICAgLy8gY2hpbGRDb250cmFjdFZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBCYXNlRmFjdG9yeUdsb2JhbFN0YXRlS2V5Q2hpbGRDb250cmFjdFZlcnNpb24gfSkKICAgIGJ5dGVjIDggLy8gImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MwogICAgLy8gdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSA9IHZlcnNpb24KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzIgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDQKICAgIC8vIGlmICghdGhpcy5ib3hlZENvbnRyYWN0LmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogaW5pdEJveGVkQ29udHJhY3RfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjQ1CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGJueiBpbml0Qm94ZWRDb250cmFjdF9hZnRlcl9hc3NlcnRANAogICAgYnl0ZWNfMyAvLyAiRVJSOk5EQU8iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkRBTwoKaW5pdEJveGVkQ29udHJhY3RfYWZ0ZXJfYXNzZXJ0QDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzIgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDYKICAgIC8vIHRoaXMuYm94ZWRDb250cmFjdC5jcmVhdGUoeyBzaXplIH0pCiAgICBkaWcgMQogICAgYm94X2NyZWF0ZQogICAgcG9wCgppbml0Qm94ZWRDb250cmFjdF9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MgogICAgLy8gaW5pdEJveGVkQ29udHJhY3QodmVyc2lvbjogc3RyaW5nLCBzaXplOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmluaXRCb3hlZENvbnRyYWN0X2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDgKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMSAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDgKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IGluaXRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEA3CiAgICBieXRlY18zIC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgppbml0Qm94ZWRDb250cmFjdF9hZnRlcl9hc3NlcnRANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlc2l6ZShzaXplKQogICAgZGlnIDEKICAgIGJveF9yZXNpemUKICAgIGIgaW5pdEJveGVkQ29udHJhY3RfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6OkZhY3RvcnlDb250cmFjdC5sb2FkQm94ZWRDb250cmFjdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmxvYWRCb3hlZENvbnRyYWN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTMKICAgIC8vIGxvYWRCb3hlZENvbnRyYWN0KG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTQKICAgIC8vIGNvbnN0IGV4cGVjdGVkUHJldmlvdXNDYWxsczogdWludDY0ID0gb2Zmc2V0IC8gMjAzMgogICAgcHVzaGludCAyMDMyCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1NQogICAgLy8gY29uc3QgdHhuID0gZ3R4bi5UcmFuc2FjdGlvbihUeG4uZ3JvdXBJbmRleCAtIGV4cGVjdGVkUHJldmlvdXNDYWxscyAtIDEpCiAgICB0eG4gR3JvdXBJbmRleAogICAgc3dhcAogICAgLQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTcKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGR1cAogICAgZ3R4bnMgQXBwbGljYXRpb25JRAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OQogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIGR1cAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTkKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIGJ6IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjAKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgZHVwCiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3LTYwCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIGJueiBsb2FkQm94ZWRDb250cmFjdF9ib29sX2ZhbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjYxCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0Qm94ZWRDb250cmFjdCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiaW5pdEJveGVkQ29udHJhY3Qoc3RyaW5nLHVpbnQ2NCl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3LTYxCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXRCb3hlZENvbnRyYWN0KQogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2MgogICAgLy8gJiYgdHhuLnNlbmRlciA9PT0gVHhuLnNlbmRlcgogICAgZHVwCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1Ny02MgogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0Qm94ZWRDb250cmFjdCkKICAgIC8vICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIGJ6IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgaW50Y18xIC8vIDEKCmxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU2LTYzCiAgICAvLyBsb2dnZWRBc3NlcnQoKAogICAgLy8gICB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gICAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gICAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgLy8gICAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICAgJiYgdHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yKHRoaXMuaW5pdEJveGVkQ29udHJhY3QpCiAgICAvLyAgICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIC8vICksIEVSUl9JTlZBTElEX0NBTExfT1JERVIpCiAgICBibnogbG9hZEJveGVkQ29udHJhY3RfYWZ0ZXJfYXNzZXJ0QDExCiAgICBwdXNoYnl0ZXMgIkVSUjpJQ09SIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklDT1IKCmxvYWRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2NAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuYm94ZWRDb250cmFjdC5leGlzdHMsIEVSUl9DT05UUkFDVF9OT1RfU0VUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogbG9hZEJveGVkQ29udHJhY3RfYWZ0ZXJfYXNzZXJ0QDEzCiAgICBwdXNoYnl0ZXMgIkVSUjpDTlNUIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkNOU1QKCmxvYWRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2NQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlcGxhY2Uob2Zmc2V0LCBkYXRhKQogICAgZGlnIDMKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTMKICAgIC8vIGxvYWRCb3hlZENvbnRyYWN0KG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgbG9hZEJveGVkQ29udHJhY3RfYm9vbF9tZXJnZUA5CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6OkZhY3RvcnlDb250cmFjdC5kZWxldGVCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlQm94ZWRDb250cmFjdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY5CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjXzEgLy8gIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY5CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGJueiBkZWxldGVCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18zIC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgpkZWxldGVCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18yIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjcwCiAgICAvLyB0aGlzLmJveGVkQ29udHJhY3QuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjgKICAgIC8vIGRlbGV0ZUJveGVkQ29udHJhY3QoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhRmVlR2VuZXJhdG9yQ29udHJhY3RXaXRoT3B0SW4ub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxOTQKICAgIC8vIG9wdEluKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgYXNzZXQ6IEFzc2V0KTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cG4gMgogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTk2CiAgICAvLyBjb25zdCBlc2Nyb3cgPSBjbG9uZSh0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgyCiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEVzY3Jvd0NvbmZpZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjIDQgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NgogICAgLy8gY29uc3QgZXNjcm93ID0gY2xvbmUodGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDQKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NwogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgZXNjcm93LmFwcC5hZGRyZXNzLCBhc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NwogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgZXNjcm93LmFwcC5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5OQogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UX1JFQ0VJVkVSKQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IG9wdEluX2FmdGVyX2Fzc2VydEAzCiAgICBwdXNoYnl0ZXMgIkVSUjpJUE1SIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQTVIKCm9wdEluX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjAwCiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5hbW91bnQgPT09IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqICgxICsgY291bnQpLCBFUlJfSU5WQUxJRF9QQVlNRU5UX0FNT1VOVCkKICAgIGRpZyAzCiAgICBndHhucyBBbW91bnQKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICArCiAgICAqCiAgICA9PQogICAgYm56IG9wdEluX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpJUE1BIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQTUEKCm9wdEluX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjAyLTIwOAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIwNAogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZGlnIDMKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMDUKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjAyLTIwNwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIwMi0yMDgKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjE1CiAgICAvLyBpZiAoY291bnQgPiAwICYmIGVzY3Jvdy5uYW1lICE9PSAnJykgewogICAgZHVwCiAgICBieiBvcHRJbl9hZnRlcl9pZl9lbHNlQDkKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAiIgogICAgIT0KICAgIGJ6IG9wdEluX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0CiAgICAvLyBjb25zdCBbcGx1Z2luQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1BsdWdpbkFwcExpc3QpKQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE4CiAgICAvLyBjb25zdCB7IHJldmVudWVNYW5hZ2VyIH0gPSBnZXRQbHVnaW5BcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4CiAgICBidXJ5IDEyCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTIwCiAgICAvLyBjb25zdCBlc2Nyb3cgPSBjbG9uZSh0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgyCiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEVzY3Jvd0NvbmZpZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjIDQgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyMAogICAgLy8gY29uc3QgZXNjcm93ID0gY2xvbmUodGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgNQogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTIxCiAgICAvLyBjb25zdCB7IGlkIH0gPSB0aGlzLmdldEVzY3Jvdyhlc2Nyb3cubmFtZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBzd2FwCiAgICBieXRlY18xIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo5NS05OAogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjk3CiAgICAvLyBhcmdzOiBbW25hbWVdXSwKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBidXJ5IDEzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo5NS05OAogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIHB1c2hieXRlcyAweGEyNDAzZGRmIC8vIG1ldGhvZCAiYXJjNThfZ2V0RXNjcm93cyhzdHJpbmdbXSkodWludDY0LGJvb2wpW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgOQogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3R5cGVzLnRzOjpFc2Nyb3dJbmZvPgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTAwCiAgICAvLyBsb2dnZWRBc3NlcnQoZXNjcm93LmlkICE9PSAwLCBFUlJfRVNDUk9XX0RPRVNfTk9UX0VYSVNUKQogICAgZXh0cmFjdCA2IDkKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJueiBvcHRJbl9hZnRlcl9hc3NlcnRAMTIKICAgIHB1c2hieXRlcyAiRVJSOk5FU0MiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkVTQwoKb3B0SW5fYWZ0ZXJfYXNzZXJ0QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTIyCiAgICAvLyBsb2dnZWRBc3NlcnQoaWQgPT09IGVzY3Jvdy5hcHAuaWQsIEVSUl9XUk9OR19FU0NST1dfRk9SX09QRVJBVElPTikKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA3CiAgICBkaWcgOAogICAgPT0KICAgIGJueiBvcHRJbl9hZnRlcl9hc3NlcnRAMTQKICAgIHB1c2hieXRlcyAiRVJSOldFU0MiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6V0VTQwoKb3B0SW5fYWZ0ZXJfYXNzZXJ0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTI0LTEzMwogICAgLy8gaXR4bkNvbXBvc2UuYmVnaW48dHlwZW9mIEFic3RyYWN0ZWRBY2NvdW50LnByb3RvdHlwZS5hcmM1OF9yZWtleVRvUGx1Z2luPih7CiAgICAvLyAgIGFwcElkOiB3YWxsZXQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICByZXZlbnVlTWFuYWdlciwKICAgIC8vICAgICBDYWxsZXJUeXBlR2xvYmFsLAogICAgLy8gICAgIGVzY3Jvdy5uYW1lLAogICAgLy8gICAgIFswXSwgLy8gYWxsIHRoZSBha2l0YSBlc2Nyb3dzIGhhdmUgbWV0aG9kIHJlc3RyaWN0aW9ucyB3aXRoIG9wdGluIGJlaW5nIGluZGV4IDAKICAgIC8vICAgICBbXQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIGRpZyA0CiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGJ5dGVzIDB4NWFkZjMzOGYgLy8gbWV0aG9kICJhcmM1OF9yZWtleVRvUGx1Z2luKHVpbnQ2NCx1aW50NjQsc3RyaW5nLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDExCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzAKICAgIC8vIFswXSwgLy8gYWxsIHRoZSBha2l0YSBlc2Nyb3dzIGhhdmUgbWV0aG9kIHJlc3RyaWN0aW9ucyB3aXRoIG9wdGluIGJlaW5nIGluZGV4IDAKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTMxCiAgICAvLyBbXQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyNC0xMzMKICAgIC8vIGl0eG5Db21wb3NlLmJlZ2luPHR5cGVvZiBBYnN0cmFjdGVkQWNjb3VudC5wcm90b3R5cGUuYXJjNThfcmVrZXlUb1BsdWdpbj4oewogICAgLy8gICBhcHBJZDogd2FsbGV0LAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgcmV2ZW51ZU1hbmFnZXIsCiAgICAvLyAgICAgQ2FsbGVyVHlwZUdsb2JhbCwKICAgIC8vICAgICBlc2Nyb3cubmFtZSwKICAgIC8vICAgICBbMF0sIC8vIGFsbCB0aGUgYWtpdGEgZXNjcm93cyBoYXZlIG1ldGhvZCByZXN0cmljdGlvbnMgd2l0aCBvcHRpbiBiZWluZyBpbmRleCAwCiAgICAvLyAgICAgW10KICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzYKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzYKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM3CiAgICAvLyBlc2Nyb3cuYXBwLmFkZHJlc3MsCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzUtMTM5CiAgICAvLyBjb25zdCBvcHRJbkNvdW50ID0gc3BsaXRPcHRJbkNvdW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICBlc2Nyb3cuYXBwLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0CiAgICAvLyApCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciA0CiAgICBjYWxsc3ViIHNwbGl0T3B0SW5Db3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQxCiAgICAvLyBjb25zdCBtYnJBbW91bnQ6IHVpbnQ2NCA9IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIG9wdEluQ291bnQKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQzLTE1NAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgUmV2ZW51ZU1hbmFnZXJQbHVnaW5TdHViLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV2ZW51ZU1hbmFnZXIsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICB3YWxsZXQsCiAgICAvLyAgICAgdHJ1ZSwKICAgIC8vICAgICBbYXNzZXQuaWRdLAogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogZXNjcm93LmFwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQKICAgIC8vICAgICB9KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTAKICAgIC8vIHJlY2VpdmVyOiBlc2Nyb3cuYXBwLmFkZHJlc3MsCiAgICBzd2FwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQ5LTE1MgogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IGVzY3Jvdy5hcHAuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBtYnJBbW91bnQKICAgIC8vIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNDMtMTU0CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBSZXZlbnVlTWFuYWdlclBsdWdpblN0dWIucHJvdG90eXBlLm9wdEluPih7CiAgICAvLyAgIGFwcElkOiByZXZlbnVlTWFuYWdlciwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHdhbGxldCwKICAgIC8vICAgICB0cnVlLAogICAgLy8gICAgIFthc3NldC5pZF0sCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBlc2Nyb3cuYXBwLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ickFtb3VudAogICAgLy8gICAgIH0pCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0NgogICAgLy8gd2FsbGV0LAogICAgZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0OAogICAgLy8gW2Fzc2V0LmlkXSwKICAgIHN3YXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQzLTE1NAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgUmV2ZW51ZU1hbmFnZXJQbHVnaW5TdHViLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV2ZW51ZU1hbmFnZXIsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICB3YWxsZXQsCiAgICAvLyAgICAgdHJ1ZSwKICAgIC8vICAgICBbYXNzZXQuaWRdLAogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogZXNjcm93LmFwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQKICAgIC8vICAgICB9KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4NjgzNWUzYmMgLy8gbWV0aG9kICJvcHRJbih1aW50NjQsYm9vbCx1aW50NjRbXSxwYXkpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQ3CiAgICAvLyB0cnVlLAogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQzLTE1NAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgUmV2ZW51ZU1hbmFnZXJQbHVnaW5TdHViLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV2ZW51ZU1hbmFnZXIsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICB3YWxsZXQsCiAgICAvLyAgICAgdHJ1ZSwKICAgIC8vICAgICBbYXNzZXQuaWRdLAogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogZXNjcm93LmFwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQKICAgIC8vICAgICB9KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTU2CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBBYnN0cmFjdGVkQWNjb3VudC5wcm90b3R5cGUuYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3M+KHsgYXBwSWQ6IHdhbGxldCB9KQogICAgaXR4bl9uZXh0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweDZjYzNmNjA2IC8vIG1ldGhvZCAiYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3MoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTY4CiAgICAvLyBpdHhuQ29tcG9zZS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCm9wdEluX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NAogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFGZWVHZW5lcmF0b3JDb250cmFjdFdpdGhPcHRJbi5vcHRJbkNvc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbkNvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMjAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjIyCiAgICAvLyBjb25zdCBjb3VudCA9IHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLCBhc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIyMgogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywgYXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgyCiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEVzY3Jvd0NvbmZpZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjIDQgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIyMgogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywgYXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgc3BsaXRPcHRJbkNvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMjMKICAgIC8vIHJldHVybiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiAoMSArIGNvdW50KQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAyCiAgICArCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMjAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpBa2l0YUJhc2VGZWVHZW5lcmF0b3JDb250cmFjdFdpdGhvdXRBa2l0YU9wdEluLnVwZGF0ZUFraXRhREFPRXNjcm93W3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWtpdGFEQU9Fc2Nyb3c6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4NAogICAgLy8gdXBkYXRlQWtpdGFEQU9Fc2Nyb3coY29uZmlnOiBFc2Nyb3dDb25maWcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMTAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMCBvZiAoKGxlbit1dGY4W10pLHVpbnQ2NCkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6RXNjcm93Q29uZmlnCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4NQogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18xIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4NQogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBibnogdXBkYXRlQWtpdGFEQU9Fc2Nyb3dfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjXzMgLy8gIkVSUjpOREFPIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5EQU8KCnVwZGF0ZUFraXRhREFPRXNjcm93X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWMgNCAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODYKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUgPSBjbG9uZShjb25maWcpCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjg0CiAgICAvLyB1cGRhdGVBa2l0YURBT0VzY3Jvdyhjb25maWc6IEVzY3Jvd0NvbmZpZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpVcGdyYWRlYWJsZUFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ2CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OAogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18xIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OAogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBibnogdXBkYXRlX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18zIC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OQogICAgLy8gY29uc3QgdXBkYXRlUGx1Z2luID0gZ2V0UGx1Z2luQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS51cGRhdGUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ5CiAgICAvLyBjb25zdCB1cGRhdGVQbHVnaW4gPSBnZXRQbHVnaW5BcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnVwZGF0ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQKICAgIC8vIGNvbnN0IFtwbHVnaW5BcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzUGx1Z2luQXBwTGlzdCkpCiAgICBieXRlYyAxMCAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDkKICAgIC8vIGNvbnN0IHVwZGF0ZVBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkudXBkYXRlCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTAKICAgIC8vIGxvZ2dlZEFzc2VydChHbG9iYWwuY2FsbGVyQXBwbGljYXRpb25JZCA9PT0gdXBkYXRlUGx1Z2luLCBFUlJfSU5WQUxJRF9VUEdSQURFKQogICAgZ2xvYmFsIENhbGxlckFwcGxpY2F0aW9uSUQKICAgID09CiAgICBibnogdXBkYXRlX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpJVVBHIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklVUEcKCnVwZGF0ZV9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI1CiAgICAvLyB2ZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogR2xvYmFsU3RhdGVLZXlWZXJzaW9uIH0pCiAgICBieXRlYyA3IC8vICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTEKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IG5ld1ZlcnNpb24KICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDYKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpBa2l0YUJhc2VDb250cmFjdC51cGRhdGVBa2l0YURBT1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZUFraXRhREFPOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzYKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzcKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMSAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzcKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IHVwZGF0ZUFraXRhREFPX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18zIC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=" }, "byteCode": { "approval": "CyAFAAECCIzaNCYLCWFraXRhX2RhbwZ3YWxsZXQCYmMIRVJSOk5EQU8MYWtpdGFfZXNjcm93BBUffHUExTsyzAd2ZXJzaW9uFmNoaWxkX2NvbnRyYWN0X3ZlcnNpb24IRVJSOklQQVkDcGFsgATqkYDdNhoAjgEAbTEZFEQxGEEAVoIDBBGbxpgERNE6dASDZhcDJwaCBwTcothiBNNGsaQEOU6usgQz94gIBK6Ey9gEM+kslASFTe3gNhoAjgsAogmSCewJ+QpKCtIK6gzADOsNaAABACNDgASBFTYoNhoAjgEAOgAxGYEEEjEYEERCDQSKAwEii/6L/3AARQFAABqL/YAOcmV2ZW51ZV9zcGxpdHNlSCJZIwiMAIsATIk2GgFJIlkkCEsBFRJEVwIANhoCSSJZJAhLARUSRFcCADYaA0kVJRJEFzYaBEkVSwEiWUmBChJESwJMSwJSIlmBDAgSRCcHTwRnJwhPA2coTwJnJwRMZyNDIoAAMRYjCUk4ECMSRDYaAUkVIxJENhoCSRUlEkQ2GgNJFSUSRDYaBEcCIlkkCEwVEkQ2GgVHAiJZSU4CJAtMSRVMVwIAIklLBQxBACRHAiQLSwNJTwJZSUsHSU4EEkRLARVSIlkkCAhFBSMIRQFC/9VLAyQISwMSRDYaBklFDhUlEkRLCjgHMgoSQAAEJwmwAEsKOAhJRQ0hBDIBCBJAAAQnCbAAsSIoZUQWSws4AEsNFlCBCbI1gQuyNIAEC4EBQ7JCgNsPCyAFAAECCMR3JhQJYm94X2NvdW50CXZvdGVzX29uZQl2b3Rlc190d28Ldm90ZXNfdGhyZWUKdm90ZXNfZm91cgp2b3Rlc19maXZlCWFraXRhX2RhbwR0eXBlCGVuZF90aW1lCEVSUjpJUEFZB2dhdGVfaWQMb3B0aW9uX2NvdW50CEVSUjpJVk9QDG1heF9zZWxlY3RlZAhFUlI6UEFDVAhFUlI6UEVORAhFUlI6QVZPVAhFUlI6SVZPVAQVH3x1CEVSUjpJVkNUMRhAABEpImcqImcrImcnBCJnJwUiZ4AEJIfDLDYaAI4BAEsxGRREMRhBADSCBgThQZCABFvPkQAE3TCcewRaf0kyBDPpLJQEhU3t4DYaAI4GAj4DCwP6BIAEmgABACNDgASVqvXrNhoAjgEAIwAxGYEFEjEYEERCAraKAgGL/lcCAIv/JAtLAUxZSlkkCFiJgAA2GgFJFSUSRBc2GgJJFSMSRDYaA0kVJRJEFzYaBEkVJRJEFzYaBUkVgSgSRDYaBkkiWSQISwEVEkRXAgA2GgdHAiJZSU4CJAtMSRVMVwIAIklLBQxBACRHAiQLSwNJTwJZSUsHSU4EEkRLARVSIlkkCAhFBSMIRQFC/9VLAyQISwMSRDYaCEkVJRJEF0UNMg1AAAyACEVSUjpCREVQsAAyB0sKDEAADIAIRVJSOklFVE2wAEsKF4EoDEAADIAIRVJSOklQVFmwACcGSwxnJwdLC2cnCksNZycISwpngAZmdW5kZXJLCGeACHF1ZXN0aW9uSwdnSwQkD0EBCksEgQUOQQECI0AADIAIRVJSOklPUEOwAEsKgAEUEkAACUsKgAEoEkEAJksIJA9BANVLBCMJSwkPQQDLI0AADIAIRVJSOklNWFOwACcNSwlnJwtLBUlOAmcoImdJREsGSU4CIoj+h1cCAIAKb3B0aW9uX29uZUxnI0sBDERMI4j+bFcCAIAKb3B0aW9uX3R3b0xngQMPQQAeJEsFDERLBSSI/kpXAgCADG9wdGlvbl90aHJlZUxnSwSBBA9BAB+BA0sFDERLBYEDiP4iVwIAgAtvcHRpb25fZm91ckxnSwSBBQ9BAB+BBEsFDERLBYEEiP37VwIAgAtvcHRpb25fZml2ZUxnI0MiQv8yIkL++yKAADYaAUcCIllJTgKBIAskCEwVEkQyByInCGVEDUAABCcOsAAiRQNLAksBDEEAY0sBVwIASwOBIAuBIFhJRQW9RQFAAAyACEVSUjpOVk9UsABLA0m8SLGAGE1CUiByZWZ1bmQgZm9yIHBvbGwgdm90ZbIFIQSyCLIHI7IQIrIBsyIoZUQjCShMZ0sCIwhFA0L/lSNDMQAyCRJAAAyACEVSUjpNQ0ZGsAAyByInCGVEDUAABCcOsAAiKGVEQQAMgAhFUlI6U0hWQrAAI0MigAAxFiQJSTgQIxJEMRYjCUk4EIEGEkQ2GgFHAiJZSU4CJQskCEwVEkQyByInCGVEDkAABCcPsAAxAL1FAUEABCcQsABJgQUOQQCfSUEAmyNAAAQnEbAAIicGZUQxAEUHIicKZUxFB0RLAzgYTIADYWFsZUiBKFsSQQBrSwI4GUAAZEsCOBuBBBJBAFpLAiLCGoAEQ5ImVRJBAEtLAiPCGksGEkEAQEsCJMIaSwUWEkEANCNAAAyACEVSUjpGR1RFsABLAzgHMgoSQAAEJwmwAEsDOAghBBJAAAQnCbAASwGIAN9II0MiQv/JIkL/YjEWIwlJOBAjEkQ2GgFHAiJZSU4CJQskCEwVEkQyByInCGVEDkAABCcPsAAxAL1FAUEABCcQsABJgQUOQQBESUEAQCNAAAQnEbAAIicKZURBAAyACEVSUjpIR1RFsABLAjgHMgoSQAAEJwmwAEsCOAghBBJAAAQnCbAASwGIAFVII0MiQv+9NhoBSRWBIBJEvUUBgAEAIk8CVCcSTFCwI0M2GgFJFSUSRBcxACInBmVEgAZ3YWxsZXRlSHIIRBJAAAyACEVSUjpOREFPsAAnBksBZyNDigEBIoAARwUjIicHZUSAAR4SQAAMIicHZUSAASgSQQA9IicGZUQxALFMgANzYWxlSIEQW7IYgATVdLsQshqyGoEGshAisgGztD5JVwQATFcABCcSEkRJFSUSRBeMByInB2VEgAEKEkAADCInB2VEgAEeEkEAm4v/IlkjEkAABCcTsACL/yRbSYwGIicLZUQjCQ5AAAQnDLAAiwZAAB0iKWVEiwcIKUxnMQAiuUgiKGVEIwgoTGeL/4wAiYsGIxJBAA0iKmVEiwcIKkxnQv/ZiwYkEkEADSIrZUSLBwgrTGdC/8WLBoEDEkEADyInBGVEiwcIJwRMZ0L/rosGgQQSQf+mIicFZUSLBwgnBUxnQv+Xi/8iWUmMASInDWVEDkAABCcTsAAijAKLAosBDEH/eIv/VwIASYwAiwIlC1tJjAUiJwtlRCMJDkAABCcMsACLAiMISYwDjASLBIsBDEEAG4sEJQuLAExbiwUTQAAEJwywAIsEIwiMBEL/3YsFQAARIillRIsHCClMZ4sDjAJC/5eLBSMSQQANIiplRIsHCCpMZ0L/5YsFJBJBAA0iK2VEiwcIK0xnQv/RiwWBAxJBAA8iJwRlRIsHCCcETGdC/7qLBYEEEkH/siInBWVEiwcIJwVMZ0L/o7JAIrIZgASVqvXrshpMshpLCrIaSwmyGksIshqyGksGshpLBbIaSwyyGoEGshAisgGztwA9sUlyCEQyAbIIsgcjshAisgGzFicFTFCwI0M2GgFJFSUSRBdJcgdEMgoSQAAMgAhFUlI6TkFQTLAARwKABmZ1bmRlcmVISVcAIEyBIFuxgQWyGU8CshiABCSHwyyyGoEGshAisgGzsbIIsgcjshAisgGzI0MhBDIBCBYnBUxQsCNDNhoBSSJZJAhLARUSRFcCADYaAkkVJRJEF0wnCExnKr1FAUAAEjEAMgkSQAADK7AAKksBuUgjQzEAIihlRCllSHIIRBJAAAMrsAAqSwHTQv/kNhoBSRUlEkQXSTYaAkkiWSQISwEVEkRXAgBMgfAPCjEWTAkjCUk4EIEGEkEAVkk4GDIIEkEATUk4G4EDEkEAREk4GUAAPkkiwhonBhJBADRJOAAxABJBACsjQAAMgAhFUlI6SUNPUrAAKr1FAUAADIAIRVJSOkNOU1SwACpLA0sDuyNDIkL/0jEAIihlRCllSHIIRBJAAAMrsAAqvEgjQyJHAoAARwMxFiMJRwI4ECMSRDYaAUkVJRJEF0lOAiInBGVMSU4CTgREIihlREwkW3IIRE8CiPT7TDgHMgoSQAAMgAhFUlI6SVBNUrAASwM4CDIQI0sDCAsSQAAMgAhFUlI6SVBNQbAAsTIKSwOyESKyErIUgQSyECKyAbNJQQFUSwFJIllLARVSVwIAgAATQQFCIihlREkpZUhFBkknCmVISVcICEUMJVtFCCInBGVMSU4CRQVESSJZSwEVUklFC1cCAEwpZUhMsSMWRQ1JFRZXBgJMUIAEAAEAAkxQTLIYgASiQD3fshqyGoEGshAisgGztD5JVwQASwFXAAQnBRJESSJZgQkLJAhMFRJEVwYJIltJRQlAAAyACEVSUjpORVNDsABLASRbSUUHSwgSQAAMgAhFUlI6V0VTQ7AAsUsESbIYgARa3zOPshpLCrIaSwuyGksJshqACgABAAAAAAAAAACyGoACAACyGoEGshAisgEiKGVESwdJTgJyCERLBklOBIjzrTIQC7ZMcghEsgeyCCOyECKyAbZLARZMFoACAAFMUEsJshiABGg147yyGkyyGoABgLIashqBBrIQIrIBtrIYgARsw/YGshqBBrIQIrIBsyNDNhoBSRUlEkQXIihlRCInBGVEJFtyCERPAojzQTIQI08CCAsWJwVMULAjQzYaAUcCFUsBIllJgQoSRE8CTEsCUiJZgQwIEkQxACIoZUQpZUhyCEQSQAADK7AAJwRLAWcjQzYaAUkiWSQISwEVEkRXAgAxACIoZUQpZUhyCEQSQAADK7AAIihlRCcKZUiBEFsyDRJAAAyACEVSUjpJVVBHsAAnB0sBZyNDNhoBSRUlEkQXMQAiKGVEKWVIcghEEkAAAyuwAChLAWcjQw==", "clear": "C4EBQw==" }, "events": [], "templateVariables": {} };
945
+ var BinaryStateValue = class {
946
+ constructor(value) {
947
+ this.value = value;
948
+ }
949
+ value;
950
+ asByteArray() {
951
+ return this.value;
952
+ }
953
+ asString() {
954
+ return this.value !== void 0 ? Buffer.from(this.value).toString("utf-8") : void 0;
955
+ }
956
+ };
957
+ var PollFactoryParamsFactory = class _PollFactoryParamsFactory {
958
+ /**
959
+ * Gets available create ABI call param factories
960
+ */
961
+ static get create() {
962
+ return {
963
+ _resolveByMethod(params) {
964
+ switch (params.method) {
965
+ case "create":
966
+ case "create(string,string,uint64,(string,uint64))void":
967
+ return _PollFactoryParamsFactory.create.create(params);
968
+ }
969
+ throw new Error(`Unknown ' + verb + ' method`);
970
+ },
971
+ /**
972
+ * Constructs create ABI call params for the PollFactory smart contract using the create(string,string,uint64,(string,uint64))void ABI method
973
+ *
974
+ * @param params Parameters for the call
975
+ * @returns An `AppClientMethodCallParams` object for the call
976
+ */
977
+ create(params) {
978
+ return {
979
+ ...params,
980
+ method: "create(string,string,uint64,(string,uint64))void",
981
+ args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.childVersion, params.args.akitaDao, params.args.akitaDaoEscrow]
982
+ };
983
+ }
984
+ };
985
+ }
986
+ /**
987
+ * Gets available update ABI call param factories
988
+ */
989
+ static get update() {
990
+ return {
991
+ _resolveByMethod(params) {
992
+ switch (params.method) {
993
+ case "update":
994
+ case "update(string)void":
995
+ return _PollFactoryParamsFactory.update.update(params);
996
+ }
997
+ throw new Error(`Unknown ' + verb + ' method`);
998
+ },
999
+ /**
1000
+ * Constructs update ABI call params for the PollFactory smart contract using the update(string)void ABI method
1001
+ *
1002
+ * @param params Parameters for the call
1003
+ * @returns An `AppClientMethodCallParams` object for the call
1004
+ */
1005
+ update(params) {
1006
+ return {
1007
+ ...params,
1008
+ method: "update(string)void",
1009
+ args: Array.isArray(params.args) ? params.args : [params.args.newVersion]
1010
+ };
1011
+ }
1012
+ };
1013
+ }
1014
+ /**
1015
+ * Constructs a no op call for the new(pay,uint8,uint64,uint64,string,string[],uint64)uint64 ABI method
1016
+ *
1017
+ * @param params Parameters for the call
1018
+ * @returns An `AppClientMethodCallParams` object for the call
1019
+ */
1020
+ static new(params) {
1021
+ return {
1022
+ ...params,
1023
+ method: "new(pay,uint8,uint64,uint64,string,string[],uint64)uint64",
1024
+ args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.type, params.args.endTime, params.args.maxSelected, params.args.question, params.args.options, params.args.gateId]
1025
+ };
1026
+ }
1027
+ /**
1028
+ * Constructs a no op call for the deletePoll(uint64)void ABI method
1029
+ *
1030
+ * @param params Parameters for the call
1031
+ * @returns An `AppClientMethodCallParams` object for the call
1032
+ */
1033
+ static deletePoll(params) {
1034
+ return {
1035
+ ...params,
1036
+ method: "deletePoll(uint64)void",
1037
+ args: Array.isArray(params.args) ? params.args : [params.args.appId]
1038
+ };
1039
+ }
1040
+ /**
1041
+ * Constructs a no op call for the newPollCost()uint64 ABI method
1042
+ *
1043
+ * @param params Parameters for the call
1044
+ * @returns An `AppClientMethodCallParams` object for the call
1045
+ */
1046
+ static newPollCost(params) {
1047
+ return {
1048
+ ...params,
1049
+ method: "newPollCost()uint64",
1050
+ args: Array.isArray(params.args) ? params.args : []
1051
+ };
1052
+ }
1053
+ /**
1054
+ * Constructs a no op call for the initBoxedContract(string,uint64)void ABI method
1055
+ *
1056
+ * @param params Parameters for the call
1057
+ * @returns An `AppClientMethodCallParams` object for the call
1058
+ */
1059
+ static initBoxedContract(params) {
1060
+ return {
1061
+ ...params,
1062
+ method: "initBoxedContract(string,uint64)void",
1063
+ args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.size]
1064
+ };
1065
+ }
1066
+ /**
1067
+ * Constructs a no op call for the loadBoxedContract(uint64,byte[])void ABI method
1068
+ *
1069
+ * @param params Parameters for the call
1070
+ * @returns An `AppClientMethodCallParams` object for the call
1071
+ */
1072
+ static loadBoxedContract(params) {
1073
+ return {
1074
+ ...params,
1075
+ method: "loadBoxedContract(uint64,byte[])void",
1076
+ args: Array.isArray(params.args) ? params.args : [params.args.offset, params.args.data]
1077
+ };
1078
+ }
1079
+ /**
1080
+ * Constructs a no op call for the deleteBoxedContract()void ABI method
1081
+ *
1082
+ * @param params Parameters for the call
1083
+ * @returns An `AppClientMethodCallParams` object for the call
1084
+ */
1085
+ static deleteBoxedContract(params) {
1086
+ return {
1087
+ ...params,
1088
+ method: "deleteBoxedContract()void",
1089
+ args: Array.isArray(params.args) ? params.args : []
1090
+ };
1091
+ }
1092
+ /**
1093
+ * Constructs a no op call for the optIn(pay,uint64)void ABI method
1094
+ *
1095
+ * optIn opts this contract into `asset`. When this contract has a
1096
+ named escrow configured (`akitaDAOEscrow.value.name !== ''`), it
1097
+ also opts the escrow and every revenue-split recipient in through
1098
+ the revenue-manager plugin — so downstream methods (subscribe,
1099
+ list, etc.) can transfer to the escrow without doing the plugin-
1100
+ rekey dance mid-group.
1101
+
1102
+ Payment must cover:
1103
+ - this contract's own opt-in (1 × assetOptInMinBalance), plus
1104
+ - each downstream opt-in the escrow still needs.
1105
+ `splitOptInCount` returns 0 once the escrow is already opted in, so
1106
+ the charge collapses to just 1 × assetOptInMinBalance on repeat
1107
+ calls and the escrow branch becomes a no-op.
1108
+
1109
+ *
1110
+ * @param params Parameters for the call
1111
+ * @returns An `AppClientMethodCallParams` object for the call
1112
+ */
1113
+ static optIn(params) {
1114
+ return {
1115
+ ...params,
1116
+ method: "optIn(pay,uint64)void",
1117
+ args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset]
1118
+ };
1119
+ }
1120
+ /**
1121
+ * Constructs a no op call for the optInCost(uint64)uint64 ABI method
1122
+ *
1123
+ * @param params Parameters for the call
1124
+ * @returns An `AppClientMethodCallParams` object for the call
1125
+ */
1126
+ static optInCost(params) {
1127
+ return {
1128
+ ...params,
1129
+ method: "optInCost(uint64)uint64",
1130
+ args: Array.isArray(params.args) ? params.args : [params.args.asset]
1131
+ };
1132
+ }
1133
+ /**
1134
+ * Constructs a no op call for the updateAkitaDAOEscrow((string,uint64))void ABI method
1135
+ *
1136
+ * @param params Parameters for the call
1137
+ * @returns An `AppClientMethodCallParams` object for the call
1138
+ */
1139
+ static updateAkitaDaoEscrow(params) {
1140
+ return {
1141
+ ...params,
1142
+ method: "updateAkitaDAOEscrow((string,uint64))void",
1143
+ args: Array.isArray(params.args) ? params.args : [params.args.config]
1144
+ };
1145
+ }
1146
+ /**
1147
+ * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method
1148
+ *
1149
+ * @param params Parameters for the call
1150
+ * @returns An `AppClientMethodCallParams` object for the call
1151
+ */
1152
+ static updateAkitaDao(params) {
1153
+ return {
1154
+ ...params,
1155
+ method: "updateAkitaDAO(uint64)void",
1156
+ args: Array.isArray(params.args) ? params.args : [params.args.akitaDao]
1157
+ };
1158
+ }
1159
+ /**
1160
+ * Constructs a no op call for the opUp()void ABI method
1161
+ *
1162
+ * @param params Parameters for the call
1163
+ * @returns An `AppClientMethodCallParams` object for the call
1164
+ */
1165
+ static opUp(params) {
1166
+ return {
1167
+ ...params,
1168
+ method: "opUp()void",
1169
+ args: Array.isArray(params.args) ? params.args : []
1170
+ };
1171
+ }
1172
+ };
1173
+ var PollFactoryFactory = class {
1174
+ /**
1175
+ * The underlying `AppFactory` for when you want to have more flexibility
1176
+ */
1177
+ appFactory;
1178
+ /**
1179
+ * Creates a new instance of `PollFactoryFactory`
1180
+ *
1181
+ * @param params The parameters to initialise the app factory with
1182
+ */
1183
+ constructor(params) {
1184
+ this.appFactory = new _AppFactory2({
1185
+ ...params,
1186
+ appSpec: APP_SPEC2
1187
+ });
1188
+ }
1189
+ /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */
1190
+ get appName() {
1191
+ return this.appFactory.appName;
1192
+ }
1193
+ /** The ARC-56 app spec being used */
1194
+ get appSpec() {
1195
+ return APP_SPEC2;
1196
+ }
1197
+ /** A reference to the underlying `AlgorandClient` this app factory is using. */
1198
+ get algorand() {
1199
+ return this.appFactory.algorand;
1200
+ }
1201
+ /**
1202
+ * Returns a new `AppClient` client for an app instance of the given ID.
1203
+ *
1204
+ * Automatically populates appName, defaultSender and source maps from the factory
1205
+ * if not specified in the params.
1206
+ * @param params The parameters to create the app client
1207
+ * @returns The `AppClient`
1208
+ */
1209
+ getAppClientById(params) {
1210
+ return new PollFactoryClient(this.appFactory.getAppClientById(params));
1211
+ }
1212
+ /**
1213
+ * Returns a new `AppClient` client, resolving the app by creator address and name
1214
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
1215
+ *
1216
+ * Automatically populates appName, defaultSender and source maps from the factory
1217
+ * if not specified in the params.
1218
+ * @param params The parameters to create the app client
1219
+ * @returns The `AppClient`
1220
+ */
1221
+ async getAppClientByCreatorAndName(params) {
1222
+ return new PollFactoryClient(await this.appFactory.getAppClientByCreatorAndName(params));
1223
+ }
1224
+ /**
1225
+ * Idempotently deploys the PollFactory smart contract.
1226
+ *
1227
+ * @param params The arguments for the contract calls and any additional parameters for the call
1228
+ * @returns The deployment result
1229
+ */
1230
+ async deploy(params = {}) {
1231
+ var _a, _b;
1232
+ const result = await this.appFactory.deploy({
1233
+ ...params,
1234
+ createParams: ((_a = params.createParams) == null ? void 0 : _a.method) ? PollFactoryParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams : void 0,
1235
+ updateParams: ((_b = params.updateParams) == null ? void 0 : _b.method) ? PollFactoryParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams : void 0
1236
+ });
1237
+ return { result: result.result, appClient: new PollFactoryClient(result.appClient) };
1238
+ }
1239
+ /**
1240
+ * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
1241
+ */
1242
+ params = {
1243
+ /**
1244
+ * Gets available create methods
1245
+ */
1246
+ create: {
1247
+ /**
1248
+ * Creates a new instance of the PollFactory smart contract using the create(string,string,uint64,(string,uint64))void ABI method.
1249
+ *
1250
+ * @param params The params for the smart contract call
1251
+ * @returns The create params
1252
+ */
1253
+ create: (params) => {
1254
+ return this.appFactory.params.create(PollFactoryParamsFactory.create.create(params));
1255
+ }
1256
+ },
1257
+ /**
1258
+ * Gets available deployUpdate methods
1259
+ */
1260
+ deployUpdate: {
1261
+ /**
1262
+ * Updates an existing instance of the PollFactory smart contract using the update(string)void ABI method.
1263
+ *
1264
+ * @param params The params for the smart contract call
1265
+ * @returns The deployUpdate params
1266
+ */
1267
+ update: (params) => {
1268
+ return this.appFactory.params.deployUpdate(PollFactoryParamsFactory.update.update(params));
1269
+ }
1270
+ }
1271
+ };
1272
+ /**
1273
+ * Create transactions for the current app
1274
+ */
1275
+ createTransaction = {
1276
+ /**
1277
+ * Gets available create methods
1278
+ */
1279
+ create: {
1280
+ /**
1281
+ * Creates a new instance of the PollFactory smart contract using the create(string,string,uint64,(string,uint64))void ABI method.
1282
+ *
1283
+ * @param params The params for the smart contract call
1284
+ * @returns The create transaction
1285
+ */
1286
+ create: (params) => {
1287
+ return this.appFactory.createTransaction.create(PollFactoryParamsFactory.create.create(params));
1288
+ }
1289
+ }
1290
+ };
1291
+ /**
1292
+ * Send calls to the current app
1293
+ */
1294
+ send = {
1295
+ /**
1296
+ * Gets available create methods
1297
+ */
1298
+ create: {
1299
+ /**
1300
+ * Creates a new instance of the PollFactory smart contract using an ABI method call using the create(string,string,uint64,(string,uint64))void ABI method.
1301
+ *
1302
+ * @param params The params for the smart contract call
1303
+ * @returns The create result
1304
+ */
1305
+ create: async (params) => {
1306
+ const result = await this.appFactory.send.create(PollFactoryParamsFactory.create.create(params));
1307
+ return { result: { ...result.result, return: result.result.return }, appClient: new PollFactoryClient(result.appClient) };
1308
+ }
1309
+ }
1310
+ };
1311
+ };
1312
+ var PollFactoryClient = class _PollFactoryClient {
1313
+ /**
1314
+ * The underlying `AppClient` for when you want to have more flexibility
1315
+ */
1316
+ appClient;
1317
+ constructor(appClientOrParams) {
1318
+ this.appClient = appClientOrParams instanceof _AppClient2 ? appClientOrParams : new _AppClient2({
1319
+ ...appClientOrParams,
1320
+ appSpec: APP_SPEC2
1321
+ });
1322
+ }
1323
+ /**
1324
+ * Returns a new `PollFactoryClient` client, resolving the app by creator address and name
1325
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
1326
+ * @param params The parameters to create the app client
1327
+ */
1328
+ static async fromCreatorAndName(params) {
1329
+ return new _PollFactoryClient(await _AppClient2.fromCreatorAndName({ ...params, appSpec: APP_SPEC2 }));
1330
+ }
1331
+ /**
1332
+ * Returns an `PollFactoryClient` instance for the current network based on
1333
+ * pre-determined network-specific app IDs specified in the ARC-56 app spec.
1334
+ *
1335
+ * If no IDs are in the app spec or the network isn't recognised, an error is thrown.
1336
+ * @param params The parameters to create the app client
1337
+ */
1338
+ static async fromNetwork(params) {
1339
+ return new _PollFactoryClient(await _AppClient2.fromNetwork({ ...params, appSpec: APP_SPEC2 }));
1340
+ }
1341
+ /** The ID of the app instance this client is linked to. */
1342
+ get appId() {
1343
+ return this.appClient.appId;
1344
+ }
1345
+ /** The app address of the app instance this client is linked to. */
1346
+ get appAddress() {
1347
+ return this.appClient.appAddress;
1348
+ }
1349
+ /** The name of the app. */
1350
+ get appName() {
1351
+ return this.appClient.appName;
1352
+ }
1353
+ /** The ARC-56 app spec being used */
1354
+ get appSpec() {
1355
+ return this.appClient.appSpec;
1356
+ }
1357
+ /** A reference to the underlying `AlgorandClient` this app client is using. */
1358
+ get algorand() {
1359
+ return this.appClient.algorand;
1360
+ }
1361
+ /**
1362
+ * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
1363
+ */
1364
+ params = {
1365
+ /**
1366
+ * Gets available update methods
1367
+ */
1368
+ update: {
1369
+ /**
1370
+ * Updates an existing instance of the PollFactory smart contract using the `update(string)void` ABI method.
1371
+ *
1372
+ * @param params The params for the smart contract call
1373
+ * @returns The update params
1374
+ */
1375
+ update: (params) => {
1376
+ return this.appClient.params.update(PollFactoryParamsFactory.update.update(params));
1377
+ }
1378
+ },
1379
+ /**
1380
+ * Makes a clear_state call to an existing instance of the PollFactory smart contract.
1381
+ *
1382
+ * @param params The params for the bare (raw) call
1383
+ * @returns The clearState result
1384
+ */
1385
+ clearState: (params) => {
1386
+ return this.appClient.params.bare.clearState(params);
1387
+ },
1388
+ /**
1389
+ * Makes a call to the PollFactory smart contract using the `new(pay,uint8,uint64,uint64,string,string[],uint64)uint64` ABI method.
1390
+ *
1391
+ * @param params The params for the smart contract call
1392
+ * @returns The call params
1393
+ */
1394
+ new: (params) => {
1395
+ return this.appClient.params.call(PollFactoryParamsFactory.new(params));
1396
+ },
1397
+ /**
1398
+ * Makes a call to the PollFactory smart contract using the `deletePoll(uint64)void` ABI method.
1399
+ *
1400
+ * @param params The params for the smart contract call
1401
+ * @returns The call params
1402
+ */
1403
+ deletePoll: (params) => {
1404
+ return this.appClient.params.call(PollFactoryParamsFactory.deletePoll(params));
1405
+ },
1406
+ /**
1407
+ * Makes a call to the PollFactory smart contract using the `newPollCost()uint64` ABI method.
1408
+ *
1409
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1410
+ *
1411
+ * @param params The params for the smart contract call
1412
+ * @returns The call params
1413
+ */
1414
+ newPollCost: (params = { args: [] }) => {
1415
+ return this.appClient.params.call(PollFactoryParamsFactory.newPollCost(params));
1416
+ },
1417
+ /**
1418
+ * Makes a call to the PollFactory smart contract using the `initBoxedContract(string,uint64)void` ABI method.
1419
+ *
1420
+ * @param params The params for the smart contract call
1421
+ * @returns The call params
1422
+ */
1423
+ initBoxedContract: (params) => {
1424
+ return this.appClient.params.call(PollFactoryParamsFactory.initBoxedContract(params));
1425
+ },
1426
+ /**
1427
+ * Makes a call to the PollFactory smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.
1428
+ *
1429
+ * @param params The params for the smart contract call
1430
+ * @returns The call params
1431
+ */
1432
+ loadBoxedContract: (params) => {
1433
+ return this.appClient.params.call(PollFactoryParamsFactory.loadBoxedContract(params));
1434
+ },
1435
+ /**
1436
+ * Makes a call to the PollFactory smart contract using the `deleteBoxedContract()void` ABI method.
1437
+ *
1438
+ * @param params The params for the smart contract call
1439
+ * @returns The call params
1440
+ */
1441
+ deleteBoxedContract: (params = { args: [] }) => {
1442
+ return this.appClient.params.call(PollFactoryParamsFactory.deleteBoxedContract(params));
1443
+ },
1444
+ /**
1445
+ * Makes a call to the PollFactory smart contract using the `optIn(pay,uint64)void` ABI method.
1446
+ *
1447
+ * optIn opts this contract into `asset`. When this contract has a
1448
+ named escrow configured (`akitaDAOEscrow.value.name !== ''`), it
1449
+ also opts the escrow and every revenue-split recipient in through
1450
+ the revenue-manager plugin — so downstream methods (subscribe,
1451
+ list, etc.) can transfer to the escrow without doing the plugin-
1452
+ rekey dance mid-group.
1453
+
1454
+ Payment must cover:
1455
+ - this contract's own opt-in (1 × assetOptInMinBalance), plus
1456
+ - each downstream opt-in the escrow still needs.
1457
+ `splitOptInCount` returns 0 once the escrow is already opted in, so
1458
+ the charge collapses to just 1 × assetOptInMinBalance on repeat
1459
+ calls and the escrow branch becomes a no-op.
1460
+
1461
+ *
1462
+ * @param params The params for the smart contract call
1463
+ * @returns The call params
1464
+ */
1465
+ optIn: (params) => {
1466
+ return this.appClient.params.call(PollFactoryParamsFactory.optIn(params));
1467
+ },
1468
+ /**
1469
+ * Makes a call to the PollFactory smart contract using the `optInCost(uint64)uint64` ABI method.
1470
+ *
1471
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1472
+ *
1473
+ * @param params The params for the smart contract call
1474
+ * @returns The call params
1475
+ */
1476
+ optInCost: (params) => {
1477
+ return this.appClient.params.call(PollFactoryParamsFactory.optInCost(params));
1478
+ },
1479
+ /**
1480
+ * Makes a call to the PollFactory smart contract using the `updateAkitaDAOEscrow((string,uint64))void` ABI method.
1481
+ *
1482
+ * @param params The params for the smart contract call
1483
+ * @returns The call params
1484
+ */
1485
+ updateAkitaDaoEscrow: (params) => {
1486
+ return this.appClient.params.call(PollFactoryParamsFactory.updateAkitaDaoEscrow(params));
1487
+ },
1488
+ /**
1489
+ * Makes a call to the PollFactory smart contract using the `updateAkitaDAO(uint64)void` ABI method.
1490
+ *
1491
+ * @param params The params for the smart contract call
1492
+ * @returns The call params
1493
+ */
1494
+ updateAkitaDao: (params) => {
1495
+ return this.appClient.params.call(PollFactoryParamsFactory.updateAkitaDao(params));
1496
+ },
1497
+ /**
1498
+ * Makes a call to the PollFactory smart contract using the `opUp()void` ABI method.
1499
+ *
1500
+ * @param params The params for the smart contract call
1501
+ * @returns The call params
1502
+ */
1503
+ opUp: (params = { args: [] }) => {
1504
+ return this.appClient.params.call(PollFactoryParamsFactory.opUp(params));
1505
+ }
1506
+ };
1507
+ /**
1508
+ * Create transactions for the current app
1509
+ */
1510
+ createTransaction = {
1511
+ /**
1512
+ * Gets available update methods
1513
+ */
1514
+ update: {
1515
+ /**
1516
+ * Updates an existing instance of the PollFactory smart contract using the `update(string)void` ABI method.
1517
+ *
1518
+ * @param params The params for the smart contract call
1519
+ * @returns The update transaction
1520
+ */
1521
+ update: (params) => {
1522
+ return this.appClient.createTransaction.update(PollFactoryParamsFactory.update.update(params));
1523
+ }
1524
+ },
1525
+ /**
1526
+ * Makes a clear_state call to an existing instance of the PollFactory smart contract.
1527
+ *
1528
+ * @param params The params for the bare (raw) call
1529
+ * @returns The clearState result
1530
+ */
1531
+ clearState: (params) => {
1532
+ return this.appClient.createTransaction.bare.clearState(params);
1533
+ },
1534
+ /**
1535
+ * Makes a call to the PollFactory smart contract using the `new(pay,uint8,uint64,uint64,string,string[],uint64)uint64` ABI method.
1536
+ *
1537
+ * @param params The params for the smart contract call
1538
+ * @returns The call transaction
1539
+ */
1540
+ new: (params) => {
1541
+ return this.appClient.createTransaction.call(PollFactoryParamsFactory.new(params));
1542
+ },
1543
+ /**
1544
+ * Makes a call to the PollFactory smart contract using the `deletePoll(uint64)void` ABI method.
1545
+ *
1546
+ * @param params The params for the smart contract call
1547
+ * @returns The call transaction
1548
+ */
1549
+ deletePoll: (params) => {
1550
+ return this.appClient.createTransaction.call(PollFactoryParamsFactory.deletePoll(params));
1551
+ },
1552
+ /**
1553
+ * Makes a call to the PollFactory smart contract using the `newPollCost()uint64` ABI method.
1554
+ *
1555
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1556
+ *
1557
+ * @param params The params for the smart contract call
1558
+ * @returns The call transaction
1559
+ */
1560
+ newPollCost: (params = { args: [] }) => {
1561
+ return this.appClient.createTransaction.call(PollFactoryParamsFactory.newPollCost(params));
1562
+ },
1563
+ /**
1564
+ * Makes a call to the PollFactory smart contract using the `initBoxedContract(string,uint64)void` ABI method.
1565
+ *
1566
+ * @param params The params for the smart contract call
1567
+ * @returns The call transaction
1568
+ */
1569
+ initBoxedContract: (params) => {
1570
+ return this.appClient.createTransaction.call(PollFactoryParamsFactory.initBoxedContract(params));
1571
+ },
1572
+ /**
1573
+ * Makes a call to the PollFactory smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.
1574
+ *
1575
+ * @param params The params for the smart contract call
1576
+ * @returns The call transaction
1577
+ */
1578
+ loadBoxedContract: (params) => {
1579
+ return this.appClient.createTransaction.call(PollFactoryParamsFactory.loadBoxedContract(params));
1580
+ },
1581
+ /**
1582
+ * Makes a call to the PollFactory smart contract using the `deleteBoxedContract()void` ABI method.
1583
+ *
1584
+ * @param params The params for the smart contract call
1585
+ * @returns The call transaction
1586
+ */
1587
+ deleteBoxedContract: (params = { args: [] }) => {
1588
+ return this.appClient.createTransaction.call(PollFactoryParamsFactory.deleteBoxedContract(params));
1589
+ },
1590
+ /**
1591
+ * Makes a call to the PollFactory smart contract using the `optIn(pay,uint64)void` ABI method.
1592
+ *
1593
+ * optIn opts this contract into `asset`. When this contract has a
1594
+ named escrow configured (`akitaDAOEscrow.value.name !== ''`), it
1595
+ also opts the escrow and every revenue-split recipient in through
1596
+ the revenue-manager plugin — so downstream methods (subscribe,
1597
+ list, etc.) can transfer to the escrow without doing the plugin-
1598
+ rekey dance mid-group.
1599
+
1600
+ Payment must cover:
1601
+ - this contract's own opt-in (1 × assetOptInMinBalance), plus
1602
+ - each downstream opt-in the escrow still needs.
1603
+ `splitOptInCount` returns 0 once the escrow is already opted in, so
1604
+ the charge collapses to just 1 × assetOptInMinBalance on repeat
1605
+ calls and the escrow branch becomes a no-op.
1606
+
1607
+ *
1608
+ * @param params The params for the smart contract call
1609
+ * @returns The call transaction
1610
+ */
1611
+ optIn: (params) => {
1612
+ return this.appClient.createTransaction.call(PollFactoryParamsFactory.optIn(params));
1613
+ },
1614
+ /**
1615
+ * Makes a call to the PollFactory smart contract using the `optInCost(uint64)uint64` ABI method.
1616
+ *
1617
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1618
+ *
1619
+ * @param params The params for the smart contract call
1620
+ * @returns The call transaction
1621
+ */
1622
+ optInCost: (params) => {
1623
+ return this.appClient.createTransaction.call(PollFactoryParamsFactory.optInCost(params));
1624
+ },
1625
+ /**
1626
+ * Makes a call to the PollFactory smart contract using the `updateAkitaDAOEscrow((string,uint64))void` ABI method.
1627
+ *
1628
+ * @param params The params for the smart contract call
1629
+ * @returns The call transaction
1630
+ */
1631
+ updateAkitaDaoEscrow: (params) => {
1632
+ return this.appClient.createTransaction.call(PollFactoryParamsFactory.updateAkitaDaoEscrow(params));
1633
+ },
1634
+ /**
1635
+ * Makes a call to the PollFactory smart contract using the `updateAkitaDAO(uint64)void` ABI method.
1636
+ *
1637
+ * @param params The params for the smart contract call
1638
+ * @returns The call transaction
1639
+ */
1640
+ updateAkitaDao: (params) => {
1641
+ return this.appClient.createTransaction.call(PollFactoryParamsFactory.updateAkitaDao(params));
1642
+ },
1643
+ /**
1644
+ * Makes a call to the PollFactory smart contract using the `opUp()void` ABI method.
1645
+ *
1646
+ * @param params The params for the smart contract call
1647
+ * @returns The call transaction
1648
+ */
1649
+ opUp: (params = { args: [] }) => {
1650
+ return this.appClient.createTransaction.call(PollFactoryParamsFactory.opUp(params));
1651
+ }
1652
+ };
1653
+ /**
1654
+ * Send calls to the current app
1655
+ */
1656
+ send = {
1657
+ /**
1658
+ * Gets available update methods
1659
+ */
1660
+ update: {
1661
+ /**
1662
+ * Updates an existing instance of the PollFactory smart contract using the `update(string)void` ABI method.
1663
+ *
1664
+ * @param params The params for the smart contract call
1665
+ * @returns The update result
1666
+ */
1667
+ update: async (params) => {
1668
+ const result = await this.appClient.send.update(PollFactoryParamsFactory.update.update(params));
1669
+ return { ...result, return: result.return };
1670
+ }
1671
+ },
1672
+ /**
1673
+ * Makes a clear_state call to an existing instance of the PollFactory smart contract.
1674
+ *
1675
+ * @param params The params for the bare (raw) call
1676
+ * @returns The clearState result
1677
+ */
1678
+ clearState: (params) => {
1679
+ return this.appClient.send.bare.clearState(params);
1680
+ },
1681
+ /**
1682
+ * Makes a call to the PollFactory smart contract using the `new(pay,uint8,uint64,uint64,string,string[],uint64)uint64` ABI method.
1683
+ *
1684
+ * @param params The params for the smart contract call
1685
+ * @returns The call result
1686
+ */
1687
+ new: async (params) => {
1688
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.new(params));
1689
+ return { ...result, return: result.return };
1690
+ },
1691
+ /**
1692
+ * Makes a call to the PollFactory smart contract using the `deletePoll(uint64)void` ABI method.
1693
+ *
1694
+ * @param params The params for the smart contract call
1695
+ * @returns The call result
1696
+ */
1697
+ deletePoll: async (params) => {
1698
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.deletePoll(params));
1699
+ return { ...result, return: result.return };
1700
+ },
1701
+ /**
1702
+ * Makes a call to the PollFactory smart contract using the `newPollCost()uint64` ABI method.
1703
+ *
1704
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1705
+ *
1706
+ * @param params The params for the smart contract call
1707
+ * @returns The call result
1708
+ */
1709
+ newPollCost: async (params = { args: [] }) => {
1710
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.newPollCost(params));
1711
+ return { ...result, return: result.return };
1712
+ },
1713
+ /**
1714
+ * Makes a call to the PollFactory smart contract using the `initBoxedContract(string,uint64)void` ABI method.
1715
+ *
1716
+ * @param params The params for the smart contract call
1717
+ * @returns The call result
1718
+ */
1719
+ initBoxedContract: async (params) => {
1720
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.initBoxedContract(params));
1721
+ return { ...result, return: result.return };
1722
+ },
1723
+ /**
1724
+ * Makes a call to the PollFactory smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.
1725
+ *
1726
+ * @param params The params for the smart contract call
1727
+ * @returns The call result
1728
+ */
1729
+ loadBoxedContract: async (params) => {
1730
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.loadBoxedContract(params));
1731
+ return { ...result, return: result.return };
1732
+ },
1733
+ /**
1734
+ * Makes a call to the PollFactory smart contract using the `deleteBoxedContract()void` ABI method.
1735
+ *
1736
+ * @param params The params for the smart contract call
1737
+ * @returns The call result
1738
+ */
1739
+ deleteBoxedContract: async (params = { args: [] }) => {
1740
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.deleteBoxedContract(params));
1741
+ return { ...result, return: result.return };
1742
+ },
1743
+ /**
1744
+ * Makes a call to the PollFactory smart contract using the `optIn(pay,uint64)void` ABI method.
1745
+ *
1746
+ * optIn opts this contract into `asset`. When this contract has a
1747
+ named escrow configured (`akitaDAOEscrow.value.name !== ''`), it
1748
+ also opts the escrow and every revenue-split recipient in through
1749
+ the revenue-manager plugin — so downstream methods (subscribe,
1750
+ list, etc.) can transfer to the escrow without doing the plugin-
1751
+ rekey dance mid-group.
1752
+
1753
+ Payment must cover:
1754
+ - this contract's own opt-in (1 × assetOptInMinBalance), plus
1755
+ - each downstream opt-in the escrow still needs.
1756
+ `splitOptInCount` returns 0 once the escrow is already opted in, so
1757
+ the charge collapses to just 1 × assetOptInMinBalance on repeat
1758
+ calls and the escrow branch becomes a no-op.
1759
+
1760
+ *
1761
+ * @param params The params for the smart contract call
1762
+ * @returns The call result
1763
+ */
1764
+ optIn: async (params) => {
1765
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.optIn(params));
1766
+ return { ...result, return: result.return };
1767
+ },
1768
+ /**
1769
+ * Makes a call to the PollFactory smart contract using the `optInCost(uint64)uint64` ABI method.
1770
+ *
1771
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1772
+ *
1773
+ * @param params The params for the smart contract call
1774
+ * @returns The call result
1775
+ */
1776
+ optInCost: async (params) => {
1777
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.optInCost(params));
1778
+ return { ...result, return: result.return };
1779
+ },
1780
+ /**
1781
+ * Makes a call to the PollFactory smart contract using the `updateAkitaDAOEscrow((string,uint64))void` ABI method.
1782
+ *
1783
+ * @param params The params for the smart contract call
1784
+ * @returns The call result
1785
+ */
1786
+ updateAkitaDaoEscrow: async (params) => {
1787
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.updateAkitaDaoEscrow(params));
1788
+ return { ...result, return: result.return };
1789
+ },
1790
+ /**
1791
+ * Makes a call to the PollFactory smart contract using the `updateAkitaDAO(uint64)void` ABI method.
1792
+ *
1793
+ * @param params The params for the smart contract call
1794
+ * @returns The call result
1795
+ */
1796
+ updateAkitaDao: async (params) => {
1797
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.updateAkitaDao(params));
1798
+ return { ...result, return: result.return };
1799
+ },
1800
+ /**
1801
+ * Makes a call to the PollFactory smart contract using the `opUp()void` ABI method.
1802
+ *
1803
+ * @param params The params for the smart contract call
1804
+ * @returns The call result
1805
+ */
1806
+ opUp: async (params = { args: [] }) => {
1807
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.opUp(params));
1808
+ return { ...result, return: result.return };
1809
+ }
1810
+ };
1811
+ /**
1812
+ * Clone this app client with different params
1813
+ *
1814
+ * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.
1815
+ * @returns A new app client with the altered params
1816
+ */
1817
+ clone(params) {
1818
+ return new _PollFactoryClient(this.appClient.clone(params));
1819
+ }
1820
+ /**
1821
+ * Makes a readonly (simulated) call to the PollFactory smart contract using the `newPollCost()uint64` ABI method.
1822
+ *
1823
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1824
+ *
1825
+ * @param params The params for the smart contract call
1826
+ * @returns The call result
1827
+ */
1828
+ async newPollCost(params = { args: [] }) {
1829
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.newPollCost(params));
1830
+ return result.return;
1831
+ }
1832
+ /**
1833
+ * Makes a readonly (simulated) call to the PollFactory smart contract using the `optInCost(uint64)uint64` ABI method.
1834
+ *
1835
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1836
+ *
1837
+ * @param params The params for the smart contract call
1838
+ * @returns The call result
1839
+ */
1840
+ async optInCost(params) {
1841
+ const result = await this.appClient.send.call(PollFactoryParamsFactory.optInCost(params));
1842
+ return result.return;
1843
+ }
1844
+ /**
1845
+ * Methods to access state for the current PollFactory app
1846
+ */
1847
+ state = {
1848
+ /**
1849
+ * Methods to access global state for the current PollFactory app
1850
+ */
1851
+ global: {
1852
+ /**
1853
+ * Get all current keyed values from global state
1854
+ */
1855
+ getAll: async () => {
1856
+ const result = await this.appClient.state.global.getAll();
1857
+ return {
1858
+ childContractVersion: result.childContractVersion,
1859
+ akitaDaoEscrow: result.akitaDAOEscrow,
1860
+ version: result.version,
1861
+ akitaDao: result.akitaDAO
1862
+ };
1863
+ },
1864
+ /**
1865
+ * Get the current value of the childContractVersion key in global state
1866
+ */
1867
+ childContractVersion: async () => {
1868
+ return await this.appClient.state.global.getValue("childContractVersion");
1869
+ },
1870
+ /**
1871
+ * Get the current value of the akitaDAOEscrow key in global state
1872
+ */
1873
+ akitaDaoEscrow: async () => {
1874
+ return await this.appClient.state.global.getValue("akitaDAOEscrow");
1875
+ },
1876
+ /**
1877
+ * Get the current value of the version key in global state
1878
+ */
1879
+ version: async () => {
1880
+ return await this.appClient.state.global.getValue("version");
1881
+ },
1882
+ /**
1883
+ * Get the current value of the akitaDAO key in global state
1884
+ */
1885
+ akitaDao: async () => {
1886
+ return await this.appClient.state.global.getValue("akitaDAO");
1887
+ }
1888
+ },
1889
+ /**
1890
+ * Methods to access box state for the current PollFactory app
1891
+ */
1892
+ box: {
1893
+ /**
1894
+ * Get all current keyed values from box state
1895
+ */
1896
+ getAll: async () => {
1897
+ const result = await this.appClient.state.box.getAll();
1898
+ return {
1899
+ boxedContract: new BinaryStateValue(result.boxedContract)
1900
+ };
1901
+ },
1902
+ /**
1903
+ * Get the current value of the boxedContract key in box state
1904
+ */
1905
+ boxedContract: async () => {
1906
+ return new BinaryStateValue(await this.appClient.state.box.getValue("boxedContract"));
1907
+ }
1908
+ }
1909
+ };
1910
+ newGroup(composerConfig) {
1911
+ const client = this;
1912
+ const composer = this.algorand.newGroup(composerConfig);
1913
+ let promiseChain = Promise.resolve();
1914
+ return {
1915
+ /**
1916
+ * Add a new(pay,uint8,uint64,uint64,string,string[],uint64)uint64 method call against the PollFactory contract
1917
+ */
1918
+ new(params) {
1919
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.new(params)));
1920
+ return this;
1921
+ },
1922
+ /**
1923
+ * Add a deletePoll(uint64)void method call against the PollFactory contract
1924
+ */
1925
+ deletePoll(params) {
1926
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deletePoll(params)));
1927
+ return this;
1928
+ },
1929
+ /**
1930
+ * Add a newPollCost()uint64 method call against the PollFactory contract
1931
+ */
1932
+ newPollCost(params) {
1933
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.newPollCost(params)));
1934
+ return this;
1935
+ },
1936
+ /**
1937
+ * Add a initBoxedContract(string,uint64)void method call against the PollFactory contract
1938
+ */
1939
+ initBoxedContract(params) {
1940
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.initBoxedContract(params)));
1941
+ return this;
1942
+ },
1943
+ /**
1944
+ * Add a loadBoxedContract(uint64,byte[])void method call against the PollFactory contract
1945
+ */
1946
+ loadBoxedContract(params) {
1947
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.loadBoxedContract(params)));
1948
+ return this;
1949
+ },
1950
+ /**
1951
+ * Add a deleteBoxedContract()void method call against the PollFactory contract
1952
+ */
1953
+ deleteBoxedContract(params) {
1954
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxedContract(params)));
1955
+ return this;
1956
+ },
1957
+ /**
1958
+ * Add a optIn(pay,uint64)void method call against the PollFactory contract
1959
+ */
1960
+ optIn(params) {
1961
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)));
1962
+ return this;
1963
+ },
1964
+ /**
1965
+ * Add a optInCost(uint64)uint64 method call against the PollFactory contract
1966
+ */
1967
+ optInCost(params) {
1968
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInCost(params)));
1969
+ return this;
1970
+ },
1971
+ /**
1972
+ * Add a updateAkitaDAOEscrow((string,uint64))void method call against the PollFactory contract
1973
+ */
1974
+ updateAkitaDaoEscrow(params) {
1975
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDaoEscrow(params)));
1976
+ return this;
1977
+ },
1978
+ /**
1979
+ * Add a updateAkitaDAO(uint64)void method call against the PollFactory contract
1980
+ */
1981
+ updateAkitaDao(params) {
1982
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)));
1983
+ return this;
1984
+ },
1985
+ /**
1986
+ * Add a opUp()void method call against the PollFactory contract
1987
+ */
1988
+ opUp(params) {
1989
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)));
1990
+ return this;
1991
+ },
1992
+ get update() {
1993
+ return {
1994
+ update: (params) => {
1995
+ promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params)));
1996
+ return this;
1997
+ }
1998
+ };
1999
+ },
2000
+ /**
2001
+ * Add a clear state call to the PollFactory contract
2002
+ */
2003
+ clearState(params) {
2004
+ promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)));
2005
+ return this;
2006
+ },
2007
+ addTransaction(txn, signer) {
2008
+ promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer));
2009
+ return this;
2010
+ },
2011
+ async composer() {
2012
+ await promiseChain;
2013
+ return composer;
2014
+ },
2015
+ async simulate(options) {
2016
+ var _a;
2017
+ await promiseChain;
2018
+ const result = await (!options ? composer.simulate() : composer.simulate(options));
2019
+ return {
2020
+ ...result,
2021
+ returns: (_a = result.returns) == null ? void 0 : _a.map((val) => val.returnValue)
2022
+ };
2023
+ },
2024
+ async send(params) {
2025
+ var _a;
2026
+ await promiseChain;
2027
+ const result = await composer.send(params);
2028
+ return {
2029
+ ...result,
2030
+ returns: (_a = result.returns) == null ? void 0 : _a.map((val) => val.returnValue)
2031
+ };
2032
+ }
2033
+ };
2034
+ }
2035
+ };
2036
+
2037
+ // src/poll/factory.ts
2038
+ var PollFactorySDK = class extends BaseSDK {
2039
+ constructor(params) {
2040
+ super({ factory: PollFactoryFactory, ...params }, ENV_VAR_NAMES.POLL_FACTORY_APP_ID);
2041
+ }
2042
+ /**
2043
+ * Creates a new poll and returns a PollSDK instance.
2044
+ * @returns PollSDK for the newly created poll
2045
+ */
2046
+ async new({
2047
+ sender,
2048
+ signer,
2049
+ type,
2050
+ endTime,
2051
+ maxSelected,
2052
+ question,
2053
+ options,
2054
+ gateId
2055
+ }) {
2056
+ const sendParams = this.getRequiredSendParams({ sender, signer });
2057
+ const cost = await this.cost();
2058
+ const payment = await this.client.algorand.createTransaction.payment({
2059
+ ...sendParams,
2060
+ amount: microAlgo(cost),
2061
+ receiver: this.client.appAddress
2062
+ });
2063
+ const { return: appId } = await this.client.send.new({
2064
+ ...sendParams,
2065
+ args: {
2066
+ payment,
2067
+ type,
2068
+ endTime,
2069
+ maxSelected,
2070
+ question,
2071
+ options,
2072
+ gateId
2073
+ }
2074
+ });
2075
+ if (appId === void 0) {
2076
+ throw new Error("Failed to create new poll");
2077
+ }
2078
+ return new PollSDK({
2079
+ algorand: this.algorand,
2080
+ factoryParams: {
2081
+ appId,
2082
+ defaultSender: sendParams.sender,
2083
+ defaultSigner: sendParams.signer
2084
+ }
2085
+ });
2086
+ }
2087
+ /**
2088
+ * Gets a PollSDK instance for an existing poll.
2089
+ * @param appId - The app ID of the poll
2090
+ * @returns PollSDK for the specified poll
2091
+ */
2092
+ get({ appId }) {
2093
+ return new PollSDK({
2094
+ algorand: this.algorand,
2095
+ factoryParams: {
2096
+ appId,
2097
+ defaultSender: this.sendParams.sender,
2098
+ defaultSigner: this.sendParams.signer
2099
+ }
2100
+ });
2101
+ }
2102
+ /**
2103
+ * Gets the cost to create a new poll.
2104
+ */
2105
+ async cost() {
2106
+ return await this.client.newPollCost();
2107
+ }
2108
+ /**
2109
+ * Deletes a finished poll after all vote boxes have been cleared.
2110
+ */
2111
+ async deletePoll({ sender, signer, appId }) {
2112
+ const sendParams = this.getRequiredSendParams({ sender, signer });
2113
+ const composer = this.algorand.newGroup();
2114
+ composer.addAppCallMethodCall({
2115
+ ...sendParams,
2116
+ appId: this.appId,
2117
+ method: ABIMethod.fromSignature("deletePoll(uint64)void"),
2118
+ args: [appId],
2119
+ maxFee: microAlgo(4e3)
2120
+ });
2121
+ await composer.send({
2122
+ populateAppCallResources: true,
2123
+ coverAppCallInnerTransactionFees: true
2124
+ });
2125
+ }
2126
+ /**
2127
+ * Updates the Akita DAO reference.
2128
+ */
2129
+ async updateAkitaDAO({ sender, signer, akitaDao }) {
2130
+ const sendParams = this.getSendParams({ sender, signer });
2131
+ await this.client.send.updateAkitaDao({
2132
+ ...sendParams,
2133
+ args: { akitaDao }
2134
+ });
2135
+ }
2136
+ /**
2137
+ * Updates the Akita DAO Escrow reference.
2138
+ */
2139
+ async updateAkitaDAOEscrow({ sender, signer, config }) {
2140
+ const sendParams = this.getSendParams({ sender, signer });
2141
+ await this.client.send.updateAkitaDaoEscrow({
2142
+ ...sendParams,
2143
+ args: { config }
2144
+ });
2145
+ }
2146
+ };
2147
+ async function newPoll({
2148
+ factoryParams,
2149
+ algorand,
2150
+ readerAccount,
2151
+ sendParams,
2152
+ ...pollParams
2153
+ }) {
2154
+ const factory = new PollFactorySDK({ factoryParams, algorand, readerAccount, sendParams });
2155
+ return await factory.new(pollParams);
2156
+ }
2157
+
2158
+ // src/poll/index.ts
2159
+ var PollSDK = class extends BaseSDK {
2160
+ constructor(params) {
2161
+ super({ factory: PollFactory, ...params });
2162
+ }
2163
+ // ========== Read Methods ==========
2164
+ /**
2165
+ * Gets the current state of the poll.
2166
+ */
2167
+ async state() {
2168
+ const state = await this.client.state.global.getAll();
2169
+ return {
2170
+ type: Number(state.type ?? 0),
2171
+ gateId: state.gateId ?? 0n,
2172
+ endTime: state.endTime ?? 0n,
2173
+ optionCount: state.optionCount ?? 0n,
2174
+ maxSelected: state.maxSelected ?? 0n,
2175
+ boxCount: state.boxCount ?? 0n,
2176
+ question: state.question ?? "",
2177
+ optionOne: state.optionOne ?? "",
2178
+ optionTwo: state.optionTwo ?? "",
2179
+ optionThree: state.optionThree ?? "",
2180
+ optionFour: state.optionFour ?? "",
2181
+ optionFive: state.optionFive ?? "",
2182
+ votesOne: state.votesOne ?? 0n,
2183
+ votesTwo: state.votesTwo ?? 0n,
2184
+ votesThree: state.votesThree ?? 0n,
2185
+ votesFour: state.votesFour ?? 0n,
2186
+ votesFive: state.votesFive ?? 0n
2187
+ };
2188
+ }
2189
+ /**
2190
+ * Checks if the poll has ended.
2191
+ */
2192
+ async hasEnded() {
2193
+ const pollState = await this.state();
2194
+ const now = BigInt(Math.floor(Date.now() / 1e3));
2195
+ return now > pollState.endTime;
2196
+ }
2197
+ /**
2198
+ * Checks if a user has voted in the poll.
2199
+ */
2200
+ async hasVoted({ user }) {
2201
+ const hasVoted = await this.client.hasVoted({ args: { user } });
2202
+ return hasVoted ?? false;
2203
+ }
2204
+ /**
2205
+ * Gets the options as an array.
2206
+ */
2207
+ async getOptions() {
2208
+ const pollState = await this.state();
2209
+ const options = [];
2210
+ if (pollState.optionCount >= 1n) options.push(pollState.optionOne);
2211
+ if (pollState.optionCount >= 2n) options.push(pollState.optionTwo);
2212
+ if (pollState.optionCount >= 3n) options.push(pollState.optionThree);
2213
+ if (pollState.optionCount >= 4n) options.push(pollState.optionFour);
2214
+ if (pollState.optionCount >= 5n) options.push(pollState.optionFive);
2215
+ return options;
2216
+ }
2217
+ /**
2218
+ * Gets the vote counts as an array.
2219
+ */
2220
+ async getVoteCounts() {
2221
+ const pollState = await this.state();
2222
+ const votes = [];
2223
+ if (pollState.optionCount >= 1n) votes.push(pollState.votesOne);
2224
+ if (pollState.optionCount >= 2n) votes.push(pollState.votesTwo);
2225
+ if (pollState.optionCount >= 3n) votes.push(pollState.votesThree);
2226
+ if (pollState.optionCount >= 4n) votes.push(pollState.votesFour);
2227
+ if (pollState.optionCount >= 5n) votes.push(pollState.votesFive);
2228
+ return votes;
2229
+ }
2230
+ // ========== Write Methods ==========
2231
+ /**
2232
+ * Casts a vote in the poll.
2233
+ * Provide `gateTxn` for gated polls.
2234
+ * @param votes - Array of option indices (0-based) to vote for
2235
+ */
2236
+ async vote({ sender, signer, votes, gateTxn }) {
2237
+ const sendParams = this.getRequiredSendParams({ sender, signer });
2238
+ const mbrPayment = await this.client.algorand.createTransaction.payment({
2239
+ ...sendParams,
2240
+ amount: microAlgo2(VOTES_MBR),
2241
+ receiver: this.client.appAddress
2242
+ });
2243
+ if (gateTxn) {
2244
+ await this.client.send.gatedVote({
2245
+ ...sendParams,
2246
+ args: {
2247
+ mbrPayment,
2248
+ gateTxn,
2249
+ votes
2250
+ }
2251
+ });
2252
+ } else {
2253
+ await this.client.send.vote({
2254
+ ...sendParams,
2255
+ args: {
2256
+ mbrPayment,
2257
+ votes
2258
+ }
2259
+ });
2260
+ }
2261
+ }
2262
+ /**
2263
+ * Deletes vote boxes and refunds MBR to voters.
2264
+ * Can only be called after the poll has ended.
2265
+ * @param addresses - Array of addresses to refund
2266
+ */
2267
+ async deleteBoxes({ sender, signer, addresses }) {
2268
+ const sendParams = this.getSendParams({ sender, signer });
2269
+ await this.client.send.deleteBoxes({
2270
+ ...sendParams,
2271
+ args: { addresses }
2272
+ });
2273
+ }
2274
+ };
2275
+
2276
+ export {
2277
+ PollTypeEnum,
2278
+ VOTES_MBR,
2279
+ POLL_ERROR_MESSAGES,
2280
+ translatePollError,
2281
+ PollFactorySDK,
2282
+ newPoll,
2283
+ PollSDK
2284
+ };
2285
+ //# sourceMappingURL=chunk-LDPF6M2T.mjs.map