From a345f70c530314dfbe09d0f9b0b1a7aea138a848 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Tue, 3 Dec 2024 20:45:16 +0200 Subject: [PATCH] build: use simultaneously compilation build: remove no longer needed optimized profiles build: update shell scripts test: remove no longer needed Utils functions test: use the interfaces in Base_Test instead of the contracts chore: update precompiles bytecode chore: update scripts in package.json ci: update ci workflows to pass the default profile --- .github/workflows/ci-deep.yml | 4 ---- .github/workflows/ci-fork.yml | 2 -- .github/workflows/ci.yml | 4 ---- .gitignore | 1 - .prettierignore | 1 - foundry.toml | 38 +++++++++++++++---------------- package.json | 8 +++---- precompiles/Precompiles.sol | 6 ++--- shell/prepare-artifacts.sh | 30 ++++++++++++------------ shell/update-counts.sh | 4 ++-- shell/update-precompiles.sh | 8 +++---- tests/Base.t.sol | 12 ++-------- tests/unit/shared/Adminable.t.sol | 8 ++----- tests/utils/DeployOptimized.sol | 11 ++++----- tests/utils/Precompiles.t.sol | 14 ++++-------- tests/utils/Utils.sol | 13 ----------- 16 files changed, 58 insertions(+), 106 deletions(-) diff --git a/.github/workflows/ci-deep.yml b/.github/workflows/ci-deep.yml index 57e3be580..32f49c0f4 100644 --- a/.github/workflows/ci-deep.yml +++ b/.github/workflows/ci-deep.yml @@ -41,7 +41,6 @@ jobs: uses: "sablier-labs/reusable-workflows/.github/workflows/forge-test.yml@main" with: foundry-fuzz-runs: ${{ fromJSON(inputs.unitFuzzRuns || '50000') }} - foundry-profile: "test-optimized" match-path: "tests/unit/**/*.sol" name: "Unit tests" @@ -50,7 +49,6 @@ jobs: uses: "sablier-labs/reusable-workflows/.github/workflows/forge-test.yml@main" with: foundry-fuzz-runs: ${{ fromJSON(inputs.integrationFuzzRuns || '50000') }} - foundry-profile: "test-optimized" match-path: "tests/integration/**/*.sol" name: "Integration tests" @@ -60,7 +58,6 @@ jobs: with: foundry-invariant-depth: ${{ fromJSON(inputs.invariantDepth || '100') }} foundry-invariant-runs: ${{ fromJSON(inputs.invariantRuns || '100') }} - foundry-profile: "test-optimized" match-path: "tests/invariant/**/*.sol" name: "Invariant tests" @@ -71,7 +68,6 @@ jobs: uses: "sablier-labs/reusable-workflows/.github/workflows/forge-test.yml@main" with: foundry-fuzz-runs: ${{ fromJSON(inputs.forkFuzzRuns || '1000') }} - foundry-profile: "test-optimized" match-path: "tests/fork/**/*.sol" name: "Fork tests" diff --git a/.github/workflows/ci-fork.yml b/.github/workflows/ci-fork.yml index 969da8fd0..520fe8b0d 100644 --- a/.github/workflows/ci-fork.yml +++ b/.github/workflows/ci-fork.yml @@ -18,7 +18,6 @@ jobs: uses: "sablier-labs/reusable-workflows/.github/workflows/forge-test.yml@main" with: foundry-fuzz-runs: 100 - foundry-profile: "test-optimized" fuzz-seed: true match-path: "tests/fork/**/*.sol" name: "Fork tests" @@ -27,7 +26,6 @@ jobs: needs: ["lint", "build"] uses: "sablier-labs/reusable-workflows/.github/workflows/forge-test.yml@main" with: - foundry-profile: "test-optimized" match-path: "tests/utils/**/*.sol" name: "Utils tests" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 73e38dc99..ceb3fcfe1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,6 @@ jobs: uses: "sablier-labs/reusable-workflows/.github/workflows/forge-test.yml@main" with: foundry-fuzz-runs: 2000 - foundry-profile: "test-optimized" match-path: "tests/unit/**/*.sol" name: "Unit tests" @@ -41,7 +40,6 @@ jobs: uses: "sablier-labs/reusable-workflows/.github/workflows/forge-test.yml@main" with: foundry-fuzz-runs: 2000 - foundry-profile: "test-optimized" match-path: "tests/integration/**/*.sol" name: "Integration tests" @@ -49,7 +47,6 @@ jobs: needs: ["lint", "build"] uses: "sablier-labs/reusable-workflows/.github/workflows/forge-test.yml@main" with: - foundry-profile: "test-optimized" match-path: "tests/invariant/**/*.sol" name: "Invariant tests" @@ -60,7 +57,6 @@ jobs: uses: "sablier-labs/reusable-workflows/.github/workflows/forge-test.yml@main" with: foundry-fuzz-runs: 20 - foundry-profile: "test-optimized" match-path: "tests/fork/**/*.sol" name: "Fork tests" diff --git a/.gitignore b/.gitignore index 8137232c8..33b230ac3 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,6 @@ deployments docs node_modules out -out-optimized out-svg # files diff --git a/.prettierignore b/.prettierignore index 0fba7f6e2..f15fbc603 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,7 +6,6 @@ coverage docs node_modules out -out-optimized out-svg # files diff --git a/foundry.toml b/foundry.toml index f66d68801..15d39f223 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,12 +3,18 @@ bytecode_hash = "none" evm_version = "shanghai" fs_permissions = [ - { access = "read", path = "./out-optimized" }, + { access = "read", path = "./out" }, { access = "read", path = "package.json" }, { access = "read-write", path = "./benchmark/results" }, { access = "read-write", path = "./script/"} ] gas_limit = 9223372036854775807 + # https://book.getfoundry.sh/reference/config/solidity-compiler#libraries + # TODO: Update addresses once deployed. + libraries = [ + "src/libraries/Helpers.sol:Helpers:0x7715bE116061E014Bb721b46Dc78Dd57C91FDF9b", + "src/libraries/VestingMath.sol:VestingMath:0x26F9d826BDed47Fc472526aE8095B75ac336963C" + ] optimizer = true optimizer_runs = 1000 out = "out" @@ -17,6 +23,7 @@ solc = "0.8.26" src = "src" test = "tests" + via_ir = true [profile.default.fuzz] max_test_rejects = 1_000_000 # Number of times `vm.assume` can fail @@ -28,6 +35,15 @@ fail_on_revert = true runs = 20 +additional_compiler_profiles = [ + { name = "tests/", via_ir = false } +] + +compilation_restrictions = [ + { paths = "tests/mocks", via_ir = true }, + { paths = "tests/**", via_ir = false } +] + # Run only the code inside benchmark directory [profile.benchmark] test = "benchmark" @@ -35,29 +51,15 @@ # Speed up compilation and tests during development [profile.lite] optimizer = false - -# Compile only the production code and the test mocks with via IR -[profile.optimized] - # https://book.getfoundry.sh/reference/config/solidity-compiler#libraries - # TODO: Update addresses once deployed. - libraries = [ - "src/libraries/Helpers.sol:Helpers:0x7715bE116061E014Bb721b46Dc78Dd57C91FDF9b", - "src/libraries/VestingMath.sol:VestingMath:0x26F9d826BDed47Fc472526aE8095B75ac336963C" - ] - out = "out-optimized" - test = "tests/mocks" - via_ir = true - + via_ir = false # See "SMTChecker and Formal Verification" in the Solidity docs [profile.smt] ignored_error_codes = [ 7737, # Disable inline assembly warnings ] - out = "out-optimized" script = "src" test = "src" - via_ir = true [profile.smt.model_checker] engine = "chc" # constrained Horn clauses @@ -79,10 +81,6 @@ "src/LockupNFTDescriptor.sol" = ["LockupNFTDescriptor"] "src/SablierLockup.sol" = ["SablierLockup"] -# Test the optimized contracts without re-compiling them -[profile.test-optimized] - src = "tests" - [doc] ignore = ["**/*.t.sol"] out = "docs" diff --git a/package.json b/package.json index 8f2661ac2..74afc280b 100644 --- a/package.json +++ b/package.json @@ -62,11 +62,10 @@ }, "repository": "github.com/sablier-labs/lockup", "scripts": { - "benchmark": "bun run build:optimized && FOUNDRY_PROFILE=benchmark forge test --mt testGas && bun run prettier:write", + "benchmark": "bun run build && FOUNDRY_PROFILE=benchmark forge test --mt testGas && bun run prettier:write", "build": "forge build", - "build:optimized": "FOUNDRY_PROFILE=optimized forge build", "build:smt": "FOUNDRY_PROFILE=smt forge build", - "clean": "rm -rf artifacts broadcast cache docs out out-optimized out-svg", + "clean": "rm -rf artifacts broadcast cache docs out out-svg", "lint": "bun run lint:sol && bun run prettier:check", "lint:fix": "bun run lint:sol:fix && forge fmt", "lint:sol": "forge fmt --check && bun solhint \"{benchmark,precompiles,script,src,tests}/**/*.sol\"", @@ -76,7 +75,6 @@ "prettier:check": "prettier --check \"**/*.{json,md,svg,yml}\"", "prettier:write": "prettier --write \"**/*.{json,md,svg,yml}\"", "test": "forge test", - "test:lite": "FOUNDRY_PROFILE=lite forge test", - "test:optimized": "bun run build:optimized && FOUNDRY_PROFILE=test-optimized forge test" + "test:lite": "FOUNDRY_PROFILE=lite forge test --nmt \"testFork\" --nmc \"Precompiles_Test\"" } } diff --git a/precompiles/Precompiles.sol b/precompiles/Precompiles.sol index 10163f298..f063a0d65 100644 --- a/precompiles/Precompiles.sol +++ b/precompiles/Precompiles.sol @@ -18,11 +18,11 @@ contract Precompiles { //////////////////////////////////////////////////////////////////////////*/ bytes public constant BYTECODE_BATCH_LOCKUP = - hex"608080604052346015576117a3908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c806337266dd314610d05578063606ef87514610aa45780636927604e146107c75780639e743f29146105ed578063cb0aab8c1461036f5763f7ca34eb1461005b575f80fd5b346102cf5761006936610f92565b928392919215610347579092905f90815b83811061031c57506001600160a01b036100979116918583611463565b6100a082611120565b926001600160a01b035f9516945b8381106100c757604051806100c3878261100e565b0390f35b6100df6100d582868561142f565b60c08101906112ce565b6100ed6100d584888761142f565b5f19019182101590506103085761010b916060604092020101611359565b9061020861012261011d83888761142f565b611152565b926101bb61013c6020610136868b8a61142f565b01611152565b91866001600160801b038a6001600160a01b0360e06101c98a61016b604061016583888b61142f565b01611069565b94610182606061017c84848c61142f565b01611166565b9764ffffffffff610199608061017c86868661142f565b9a816101b160a06101ab88888861142f565b01611359565b6040519e8f6110ca565b168d521660208c015261142f565b0196816040519b6101d98d6110ad565b168b521660208a01521660408801528b606088015215156080870152151560a086015260c08501523690611173565b60e083015261021b6100d582878661142f565b9290836040519485937f1b1a433f00000000000000000000000000000000000000000000000000000000855261025a610164860191600487019061136b565b61016061014486015252610184830191905f905b8082106102e657505050908060209203815f885af180156102db575f906102a5575b6001925061029e82886112ba565b52016100ae565b506020823d82116102d3575b816102be602093836110e6565b810103126102cf5760019151610290565b5f80fd5b3d91506102b1565b6040513d5f823e3d90fd5b91935091606080826102fa60019488611304565b01940192018593929161026e565b634e487b7160e01b5f52603260045260245ffd5b916001906001600160801b0361033b604061016587898b9c9a9c61142f565b1601920194929461007a565b7f36186274000000000000000000000000000000000000000000000000000000005f5260045ffd5b346102cf5760603660031901126102cf57610388610f66565b610390610f7c565b6044359067ffffffffffffffff82116102cf57366023830112156102cf57816004013567ffffffffffffffff81116102cf5760248301926024369161016084020101116102cf578015610347575f93919291845b8281106105c357506001600160a01b036104019116948486611463565b61040a81611120565b926001600160a01b03165f5b82811061042b57604051806100c3878261100e565b61043961011d828587611452565b906104d761044d602061013684888a611452565b8661045e6040610165868a85611452565b6001600160801b03610476606061017c888c87611452565b916001600160a01b0361012061049d898d610497608061017c84848d611452565b98611452565b0195816040519a6104ad8c61107d565b168a5216602089015216604087015286606087015215156080860152151560a08501523690611173565b60c083015264ffffffffff61055d60c060e06104f485898b611452565b01610543610503868a8c611452565b91610538604051987fad7628cd000000000000000000000000000000000000000000000000000000008a5260048a01906111e2565b61010488019061140d565b8361055060a0830161127b565b166101448701520161127b565b16610164830152602082610184815f8b5af180156102db575f90610591575b6001925061058a82886112ba565b5201610416565b506020823d82116105bb575b816105aa602093836110e6565b810103126102cf576001915161057c565b3d915061059d565b946001906001600160801b036105e160406101658a888a9b9a611452565b160195019392936103e4565b346102cf576105fb36610f92565b928392919215610347579092905f90815b83811061079c57506001600160a01b036106299116918583611463565b61063282611120565b926001600160a01b035f9516945b83811061065557604051806100c3878261100e565b61066d61066382868561142f565b60c08101906111ac565b61067b61066384888761142f565b5f1901918210159050610308576106999160209160061b0101611359565b906106ab61012261011d83888761142f565b60e08301526106be61066382878661142f565b9290836040519485937fd6a03d310000000000000000000000000000000000000000000000000000000085526106fd610164860191600487019061136b565b61016061014486015252610184830191905f905b80821061077a57505050908060209203815f885af180156102db575f90610748575b6001925061074182886112ba565b5201610640565b506020823d8211610772575b81610761602093836110e6565b810103126102cf5760019151610733565b3d9150610754565b919350916040808261078e6001948861128d565b019401920185939291610711565b916001906001600160801b036107bb604061016587898b9c9a9c61142f565b1601920194929461060c565b346102cf5760603660031901126102cf576107e0610f66565b6107e8610f7c565b906044359167ffffffffffffffff83116102cf57366023840112156102cf5782600401359167ffffffffffffffff83116102cf5760248401936024369161018086020101116102cf578215610347579091905f90815b838110610a7957506001600160a01b0361085b9116918483611463565b61086482611120565b926001600160a01b03165f5b83811061088557604051806100c3878261100e565b610890818588611348565b61089990611152565b90846108a682828a611348565b6020016108b290611152565b6108bd83838b611348565b6040016108c990611069565b6108d484848c611348565b6060016108e090611166565b6108eb85858d611348565b6080016108f790611166565b918b86610905818884611348565b9661090f92611348565b610140019360405197610921896110ad565b6001600160a01b031688526001600160a01b031660208801526001600160801b0316604087015286606087015215156080860152151560a0850152609f19823603016040136102cf576109a59161099460c060405192610980846110ca565b61098c60a0820161127b565b84520161127b565b602082015260c08501523690611173565b60e083015264ffffffffff87610a136109d360e06101ab868b6101006109cc83838a611348565b0196611348565b91610a08604051967f7b73dd9d000000000000000000000000000000000000000000000000000000008852600488019061136b565b61014486019061140d565b166101848301526020826101a4815f885af180156102db575f90610a47575b60019250610a4082886112ba565b5201610870565b506020823d8211610a71575b81610a60602093836110e6565b810103126102cf5760019151610a32565b3d9150610a53565b916001906001600160801b03610a98604061016587898c9b9a9b611348565b1601920193929361083e565b346102cf57610ab236610f92565b928392919215610347579092905f90815b838110610cda57506001600160a01b03610ae09116918583611463565b610ae982611120565b926001600160a01b035f9516945b838110610b0c57604051806100c3878261100e565b610b17818584611047565b610b2090611152565b90610b2c818685611047565b602001610b3890611152565b610b43828786611047565b604001610b4f90611069565b610b5a838887611047565b606001610b6690611166565b610b71848988611047565b608001610b7d90611166565b91610b89858a89611047565b60c0019360405196610b9a8861107d565b6001600160a01b031687526001600160a01b031660208701526001600160801b0316604086015289606086015215156080850152151560a084015236610bdf91611173565b60c0830152610bef818685611047565b60a08101610bfc916112ce565b9290836040519485937f42e94a7b00000000000000000000000000000000000000000000000000000000855261012485019060048601610c3b916111e2565b61012061010486015252610144830191905f905b808210610cb857505050908060209203815f885af180156102db575f90610c86575b60019250610c7f82886112ba565b5201610af7565b506020823d8211610cb0575b81610c9f602093836110e6565b810103126102cf5760019151610c71565b3d9150610c92565b9193509160608082610ccc60019488611304565b019401920185939291610c4f565b916001906001600160801b03610cf9604061016587898b9c9a9c611047565b16019201949294610ac3565b346102cf57610d1336610f92565b928392919215610347579092905f90815b838110610f3b57506001600160a01b03610d419116918583611463565b610d4a82611120565b926001600160a01b035f9516945b838110610d6d57604051806100c3878261100e565b610d78818584611047565b610d8190611152565b90610d8d818685611047565b602001610d9990611152565b610da4828786611047565b604001610db090611069565b610dbb838887611047565b606001610dc790611166565b610dd2848988611047565b608001610dde90611166565b91610dea858a89611047565b60c0019360405196610dfb8861107d565b6001600160a01b031687526001600160a01b031660208701526001600160801b0316604086015289606086015215156080850152151560a084015236610e4091611173565b60c0830152610e50818685611047565b60a08101610e5d916111ac565b9290836040519485937f6611ceab00000000000000000000000000000000000000000000000000000000855261012485019060048601610e9c916111e2565b61012061010486015252610144830191905f905b808210610f1957505050908060209203815f885af180156102db575f90610ee7575b60019250610ee082886112ba565b5201610d58565b506020823d8211610f11575b81610f00602093836110e6565b810103126102cf5760019151610ed2565b3d9150610ef3565b9193509160408082610f2d6001948861128d565b019401920185939291610eb0565b916001906001600160801b03610f5a604061016587898b9c9a9c611047565b16019201949294610d24565b600435906001600160a01b03821682036102cf57565b602435906001600160a01b03821682036102cf57565b9060606003198301126102cf576004356001600160a01b03811681036102cf57916024356001600160a01b03811681036102cf579160443567ffffffffffffffff81116102cf5760040182601f820112156102cf5780359267ffffffffffffffff84116102cf576020808301928560051b0101116102cf579190565b60206040818301928281528451809452019201905f5b8181106110315750505090565b8251845260209384019390920191600101611024565b91908110156103085760051b8101359060fe19813603018212156102cf570190565b356001600160801b03811681036102cf5790565b60e0810190811067ffffffffffffffff82111761109957604052565b634e487b7160e01b5f52604160045260245ffd5b610100810190811067ffffffffffffffff82111761109957604052565b6040810190811067ffffffffffffffff82111761109957604052565b90601f8019910116810190811067ffffffffffffffff82111761109957604052565b67ffffffffffffffff81116110995760051b60200190565b9061112a82611108565b61113760405191826110e6565b8281528092611148601f1991611108565b0190602036910137565b356001600160a01b03811681036102cf5790565b3580151581036102cf5790565b91908260409103126102cf5760405161118b816110ca565b809280356001600160a01b03811681036102cf578252602090810135910152565b903590601e19813603018212156102cf570180359067ffffffffffffffff82116102cf57602001918160061b360383136102cf57565b9060c080611265936001600160a01b0381511684526001600160a01b0360208201511660208501526001600160801b0360408201511660408501526001600160a01b03606082015116606085015260808101511515608085015260a0810151151560a08501520151910190602080916001600160a01b0381511684520151910152565b565b35906001600160801b03821682036102cf57565b359064ffffffffff821682036102cf57565b64ffffffffff6112b4602080936001600160801b036112ab82611267565b1686520161127b565b16910152565b80518210156103085760209160051b010190565b903590601e19813603018212156102cf570180359067ffffffffffffffff82116102cf576020019160608202360383136102cf57565b6001600160801b0361131582611267565b168252602081013567ffffffffffffffff81168091036102cf576112b46040809364ffffffffff9360208701520161127b565b919081101561030857610180020190565b3564ffffffffff811681036102cf5790565b9061010060e0611265936001600160a01b0381511684526001600160a01b0360208201511660208501526001600160801b0360408201511660408501526001600160a01b03606082015116606085015260808101511515608085015260a0810151151560a085015264ffffffffff602060c08301518281511660c0880152015116828501520151910190602080916001600160a01b0381511684520151910152565b6001600160801b036112b4602080938361142682611267565b16865201611267565b91908110156103085760051b8101359061011e19813603018212156102cf570190565b919081101561030857610160020190565b91906114b86040517f23b872dd000000000000000000000000000000000000000000000000000000006020820152336024820152306044820152836064820152606481526114b26084826110e6565b82611646565b6001600160a01b0381166001600160a01b03604051947fdd62ed3e0000000000000000000000000000000000000000000000000000000086523060048701521693846024820152602081604481855afa80156102db5784915f916115f9575b5010611524575b50505050565b5f8060405194602086019063095ea7b360e01b82528760248801526044870152604486526115536064876110e6565b85519082855af1906115636116cb565b826115c7575b50816115bc575b501561157d575b8061151e565b6115af6115b4936040519063095ea7b360e01b602083015260248201525f6044820152604481526114b26064826110e6565b611646565b5f8080611577565b90503b15155f611570565b805191925081159182156115df575b5050905f611569565b6115f2925060208091830101910161162e565b5f806115d6565b9150506020813d602011611626575b81611615602093836110e6565b810103126102cf578390515f611517565b3d9150611608565b908160209103126102cf575180151581036102cf5790565b5f806001600160a01b0361166f93169360208151910182865af16116686116cb565b908361170a565b80519081151591826116b0575b50506116855750565b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6116c3925060208091830101910161162e565b155f8061167c565b3d15611705573d9067ffffffffffffffff821161109957604051916116fa601f8201601f1916602001846110e6565b82523d5f602084013e565b606090565b90611747575080511561171f57805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b8151158061178d575b611758575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b1561175056fea164736f6c634300081a000a"; + hex"6080604052348015600e575f80fd5b50613ac68061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610070575f3560e01c8063848c706c1161004e578063848c706c146101045780638f33157414610134578063bf4bb0dd1461016457610070565b806320462ba5146100745780634739fa8d146100a45780635e449ca8146100d4575b5f80fd5b61008e600480360381019061008991906123fa565b610194565b60405161009b919061252b565b60405180910390f35b6100be60048036038101906100b991906125a0565b6105cc565b6040516100cb919061252b565b60405180910390f35b6100ee60048036038101906100e99190612666565b610afc565b6040516100fb919061252b565b60405180910390f35b61011e6004803603810190610119919061272c565b61102c565b60405161012b919061252b565b60405180910390f35b61014e600480360381019061014991906127f2565b6114cf565b60405161015b919061252b565b60405180910390f35b61017e600480360381019061017991906128b8565b611924565b60405161018b919061252b565b60405180910390f35b60605f8383905090505f81036101d6576040517f3618627400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f91505b8282101561023c578585838181106101f7576101f6612929565b5b90506020028101906102099190612962565b604001602081019061021b91906129cf565b6fffffffffffffffffffffffffffffffff16810190508160010191506101dc565b610247888883611d5c565b8267ffffffffffffffff811115610261576102606129fa565b5b60405190808252806020026020018201604052801561028f5781602001602082028036833780820191505090505b5093505f91505b828210156105c1578773ffffffffffffffffffffffffffffffffffffffff1663deecd64f6040518061010001604052808989878181106102d9576102d8612929565b5b90506020028101906102eb9190612962565b5f0160208101906102fc9190612a51565b73ffffffffffffffffffffffffffffffffffffffff16815260200189898781811061032a57610329612929565b5b905060200281019061033c9190612962565b602001602081019061034e9190612a51565b73ffffffffffffffffffffffffffffffffffffffff16815260200189898781811061037c5761037b612929565b5b905060200281019061038e9190612962565b60400160208101906103a091906129cf565b6fffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018989878181106103e6576103e5612929565b5b90506020028101906103f89190612962565b606001602081019061040a9190612ab1565b1515815260200189898781811061042457610423612929565b5b90506020028101906104369190612962565b60800160208101906104489190612ab1565b1515815260200189898781811061046257610461612929565b5b90506020028101906104749190612962565b8060c001906104839190612adc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081526020018989878181106104dd576104dc612929565b5b90506020028101906104ef9190612962565b60e0018036038101906105029190612c14565b81525088888681811061051857610517612929565b5b905060200281019061052a9190612962565b8060a001906105399190612c3f565b6040518463ffffffff1660e01b815260040161055793929190613000565b6020604051808303815f875af1158015610573573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105979190613061565b8483815181106105aa576105a9612929565b5b602002602001018181525050816001019150610296565b505050949350505050565b60605f8383905090505f810361060e576040517f3618627400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f91505b828210156106745785858381811061062f5761062e612929565b5b9050602002810190610641919061308c565b604001602081019061065391906129cf565b6fffffffffffffffffffffffffffffffff1681019050816001019150610614565b61067f888883611d5c565b5f8367ffffffffffffffff81111561069a576106996129fa565b5b6040519080825280602002602001820160405280156106c85781602001602082028036833780820191505090505b5094505f92505b83831015610af0578686848181106106ea576106e9612929565b5b90506020028101906106fc919061308c565b8060c0019061070b91906130b4565b60018989878181106107205761071f612929565b5b9050602002810190610732919061308c565b8060c0019061074191906130b4565b90500381811061075457610753612929565b5b905060600201604001602081019061076c9190613116565b90508873ffffffffffffffffffffffffffffffffffffffff166322bc0a806040518061012001604052808a8a888181106107a9576107a8612929565b5b90506020028101906107bb919061308c565b5f0160208101906107cc9190612a51565b73ffffffffffffffffffffffffffffffffffffffff1681526020018a8a888181106107fa576107f9612929565b5b905060200281019061080c919061308c565b602001602081019061081e9190612a51565b73ffffffffffffffffffffffffffffffffffffffff1681526020018a8a8881811061084c5761084b612929565b5b905060200281019061085e919061308c565b604001602081019061087091906129cf565b6fffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a8a888181106108b6576108b5612929565b5b90506020028101906108c8919061308c565b60600160208101906108da9190612ab1565b151581526020018a8a888181106108f4576108f3612929565b5b9050602002810190610906919061308c565b60800160208101906109189190612ab1565b1515815260200160405180604001604052808c8c8a81811061093d5761093c612929565b5b905060200281019061094f919061308c565b60a00160208101906109619190613116565b64ffffffffff1681526020018664ffffffffff1681525081526020018a8a888181106109905761098f612929565b5b90506020028101906109a2919061308c565b8060e001906109b19190612adc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081526020018a8a88818110610a0b57610a0a612929565b5b9050602002810190610a1d919061308c565b61010001803603810190610a319190612c14565b815250898987818110610a4757610a46612929565b5b9050602002810190610a59919061308c565b8060c00190610a6891906130b4565b6040518463ffffffff1660e01b8152600401610a86939291906133ad565b6020604051808303815f875af1158015610aa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac69190613061565b858481518110610ad957610ad8612929565b5b6020026020010181815250508260010192506106cf565b50505050949350505050565b60605f8383905090505f8103610b3e576040517f3618627400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f91505b82821015610ba457858583818110610b5f57610b5e612929565b5b9050602002810190610b7191906133e4565b6040016020810190610b8391906129cf565b6fffffffffffffffffffffffffffffffff1681019050816001019150610b44565b610baf888883611d5c565b5f8367ffffffffffffffff811115610bca57610bc96129fa565b5b604051908082528060200260200182016040528015610bf85781602001602082028036833780820191505090505b5094505f92505b8383101561102057868684818110610c1a57610c19612929565b5b9050602002810190610c2c91906133e4565b8060c00190610c3b919061340c565b6001898987818110610c5057610c4f612929565b5b9050602002810190610c6291906133e4565b8060c00190610c71919061340c565b905003818110610c8457610c83612929565b5b9050604002016020016020810190610c9c9190613116565b90508873ffffffffffffffffffffffffffffffffffffffff16637ee213916040518061012001604052808a8a88818110610cd957610cd8612929565b5b9050602002810190610ceb91906133e4565b5f016020810190610cfc9190612a51565b73ffffffffffffffffffffffffffffffffffffffff1681526020018a8a88818110610d2a57610d29612929565b5b9050602002810190610d3c91906133e4565b6020016020810190610d4e9190612a51565b73ffffffffffffffffffffffffffffffffffffffff1681526020018a8a88818110610d7c57610d7b612929565b5b9050602002810190610d8e91906133e4565b6040016020810190610da091906129cf565b6fffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a8a88818110610de657610de5612929565b5b9050602002810190610df891906133e4565b6060016020810190610e0a9190612ab1565b151581526020018a8a88818110610e2457610e23612929565b5b9050602002810190610e3691906133e4565b6080016020810190610e489190612ab1565b1515815260200160405180604001604052808c8c8a818110610e6d57610e6c612929565b5b9050602002810190610e7f91906133e4565b60a0016020810190610e919190613116565b64ffffffffff1681526020018664ffffffffff1681525081526020018a8a88818110610ec057610ebf612929565b5b9050602002810190610ed291906133e4565b8060e00190610ee19190612adc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081526020018a8a88818110610f3b57610f3a612929565b5b9050602002810190610f4d91906133e4565b61010001803603810190610f619190612c14565b815250898987818110610f7757610f76612929565b5b9050602002810190610f8991906133e4565b8060c00190610f98919061340c565b6040518463ffffffff1660e01b8152600401610fb69392919061354c565b6020604051808303815f875af1158015610fd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff69190613061565b85848151811061100957611008612929565b5b602002602001018181525050826001019250610bff565b50505050949350505050565b60605f8383905090505f810361106e576040517f3618627400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f91505b828210156110d45785858381811061108f5761108e612929565b5b90506020028101906110a19190613583565b60400160208101906110b391906129cf565b6fffffffffffffffffffffffffffffffff1681019050816001019150611074565b6110df888883611d5c565b8267ffffffffffffffff8111156110f9576110f86129fa565b5b6040519080825280602002602001820160405280156111275781602001602082028036833780820191505090505b5093505f91505b828210156114c4578773ffffffffffffffffffffffffffffffffffffffff16637a69584160405180610120016040528089898781811061117157611170612929565b5b90506020028101906111839190613583565b5f0160208101906111949190612a51565b73ffffffffffffffffffffffffffffffffffffffff1681526020018989878181106111c2576111c1612929565b5b90506020028101906111d49190613583565b60200160208101906111e69190612a51565b73ffffffffffffffffffffffffffffffffffffffff16815260200189898781811061121457611213612929565b5b90506020028101906112269190613583565b604001602081019061123891906129cf565b6fffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff16815260200189898781811061127e5761127d612929565b5b90506020028101906112909190613583565b60600160208101906112a29190612ab1565b151581526020018989878181106112bc576112bb612929565b5b90506020028101906112ce9190613583565b60800160208101906112e09190612ab1565b151581526020018989878181106112fa576112f9612929565b5b905060200281019061130c9190613583565b60a00180360381019061131f91906135f8565b815260200189898781811061133757611336612929565b5b90506020028101906113499190613583565b8061014001906113599190612adc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081526020018989878181106113b3576113b2612929565b5b90506020028101906113c59190613583565b610160018036038101906113d99190612c14565b8152508888868181106113ef576113ee612929565b5b90506020028101906114019190613583565b6101000189898781811061141857611417612929565b5b905060200281019061142a9190613583565b60e001602081019061143c9190613116565b6040518463ffffffff1660e01b815260040161145a9392919061366f565b6020604051808303815f875af1158015611476573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149a9190613061565b8483815181106114ad576114ac612929565b5b60200260200101818152505081600101915061112e565b505050949350505050565b60605f8383905090505f8103611511576040517f3618627400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f91505b828210156115775785858381811061153257611531612929565b5b905060200281019061154491906136ab565b604001602081019061155691906129cf565b6fffffffffffffffffffffffffffffffff1681019050816001019150611517565b611582888883611d5c565b8267ffffffffffffffff81111561159c5761159b6129fa565b5b6040519080825280602002602001820160405280156115ca5781602001602082028036833780820191505090505b5093505f91505b82821015611919578773ffffffffffffffffffffffffffffffffffffffff1662dba28660405180610100016040528089898781811061161357611612612929565b5b905060200281019061162591906136ab565b5f0160208101906116369190612a51565b73ffffffffffffffffffffffffffffffffffffffff16815260200189898781811061166457611663612929565b5b905060200281019061167691906136ab565b60200160208101906116889190612a51565b73ffffffffffffffffffffffffffffffffffffffff1681526020018989878181106116b6576116b5612929565b5b90506020028101906116c891906136ab565b60400160208101906116da91906129cf565b6fffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018989878181106117205761171f612929565b5b905060200281019061173291906136ab565b60600160208101906117449190612ab1565b1515815260200189898781811061175e5761175d612929565b5b905060200281019061177091906136ab565b60800160208101906117829190612ab1565b1515815260200189898781811061179c5761179b612929565b5b90506020028101906117ae91906136ab565b8061012001906117be9190612adc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815260200189898781811061181857611817612929565b5b905060200281019061182a91906136ab565b6101400180360381019061183e9190612c14565b81525088888681811061185457611853612929565b5b905060200281019061186691906136ab565b60e00189898781811061187c5761187b612929565b5b905060200281019061188e91906136ab565b60a0016040518463ffffffff1660e01b81526004016118af93929190613710565b6020604051808303815f875af11580156118cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ef9190613061565b84838151811061190257611901612929565b5b6020026020010181815250508160010191506115d1565b505050949350505050565b60605f8383905090505f8103611966576040517f3618627400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f91505b828210156119cc5785858381811061198757611986612929565b5b9050602002810190611999919061374c565b60400160208101906119ab91906129cf565b6fffffffffffffffffffffffffffffffff168101905081600101915061196c565b6119d7888883611d5c565b8267ffffffffffffffff8111156119f1576119f06129fa565b5b604051908082528060200260200182016040528015611a1f5781602001602082028036833780820191505090505b5093505f91505b82821015611d51578773ffffffffffffffffffffffffffffffffffffffff16630aef4433604051806101000160405280898987818110611a6957611a68612929565b5b9050602002810190611a7b919061374c565b5f016020810190611a8c9190612a51565b73ffffffffffffffffffffffffffffffffffffffff168152602001898987818110611aba57611ab9612929565b5b9050602002810190611acc919061374c565b6020016020810190611ade9190612a51565b73ffffffffffffffffffffffffffffffffffffffff168152602001898987818110611b0c57611b0b612929565b5b9050602002810190611b1e919061374c565b6040016020810190611b3091906129cf565b6fffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001898987818110611b7657611b75612929565b5b9050602002810190611b88919061374c565b6060016020810190611b9a9190612ab1565b15158152602001898987818110611bb457611bb3612929565b5b9050602002810190611bc6919061374c565b6080016020810190611bd89190612ab1565b15158152602001898987818110611bf257611bf1612929565b5b9050602002810190611c04919061374c565b8060c00190611c139190612adc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508152602001898987818110611c6d57611c6c612929565b5b9050602002810190611c7f919061374c565b60e001803603810190611c929190612c14565b815250888886818110611ca857611ca7612929565b5b9050602002810190611cba919061374c565b8060a00190611cc99190613774565b6040518463ffffffff1660e01b8152600401611ce7939291906138cf565b6020604051808303815f875af1158015611d03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d279190613061565b848381518110611d3a57611d39612929565b5b602002602001018181525050816001019150611a26565b505050949350505050565b611d893330838573ffffffffffffffffffffffffffffffffffffffff16611d99909392919063ffffffff16565b611d94838383611e1b565b505050565b611e15848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401611dce93929190613924565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611ed2565b50505050565b5f8273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30866040518363ffffffff1660e01b8152600401611e57929190613959565b602060405180830381865afa158015611e72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e969190613061565b905081811015611ecc57611ecb84838573ffffffffffffffffffffffffffffffffffffffff16611f679092919063ffffffff16565b5b50505050565b5f611efc828473ffffffffffffffffffffffffffffffffffffffff1661207490919063ffffffff16565b90505f815114158015611f20575080806020019051810190611f1e9190613994565b155b15611f6257826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611f5991906139bf565b60405180910390fd5b505050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663095ea7b38484604051602401611f979291906139d8565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050611fe58482612089565b61206e57612063848573ffffffffffffffffffffffffffffffffffffffff1663095ea7b3865f60405160240161201c929190613a38565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611ed2565b61206d8482611ed2565b5b50505050565b606061208183835f612148565b905092915050565b5f805f8473ffffffffffffffffffffffffffffffffffffffff16846040516120b19190613aa3565b5f604051808303815f865af19150503d805f81146120ea576040519150601f19603f3d011682016040523d82523d5f602084013e6120ef565b606091505b509150915081801561211c57505f8151148061211b57508080602001905181019061211a9190613994565b5b5b801561213e57505f8573ffffffffffffffffffffffffffffffffffffffff163b115b9250505092915050565b60608147101561218f57306040517fcd78605900000000000000000000000000000000000000000000000000000000815260040161218691906139bf565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516121b79190613aa3565b5f6040518083038185875af1925050503d805f81146121f1576040519150601f19603f3d011682016040523d82523d5f602084013e6121f6565b606091505b5091509150612206868383612211565b925050509392505050565b606082612226576122218261229e565b612296565b5f825114801561224c57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561228e57836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161228591906139bf565b60405180910390fd5b819050612297565b5b9392505050565b5f815111156122b05780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61231c826122f3565b9050919050565b5f61232d82612312565b9050919050565b61233d81612323565b8114612347575f80fd5b50565b5f8135905061235881612334565b92915050565b5f61236882612312565b9050919050565b6123788161235e565b8114612382575f80fd5b50565b5f813590506123938161236f565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126123ba576123b9612399565b5b8235905067ffffffffffffffff8111156123d7576123d661239d565b5b6020830191508360208202830111156123f3576123f26123a1565b5b9250929050565b5f805f8060608587031215612412576124116122eb565b5b5f61241f8782880161234a565b945050602061243087828801612385565b935050604085013567ffffffffffffffff811115612451576124506122ef565b5b61245d878288016123a5565b925092505092959194509250565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f819050919050565b6124a681612494565b82525050565b5f6124b7838361249d565b60208301905092915050565b5f602082019050919050565b5f6124d98261246b565b6124e38185612475565b93506124ee83612485565b805f5b8381101561251e57815161250588826124ac565b9750612510836124c3565b9250506001810190506124f1565b5085935050505092915050565b5f6020820190508181035f83015261254381846124cf565b905092915050565b5f8083601f8401126125605761255f612399565b5b8235905067ffffffffffffffff81111561257d5761257c61239d565b5b602083019150836020820283011115612599576125986123a1565b5b9250929050565b5f805f80606085870312156125b8576125b76122eb565b5b5f6125c58782880161234a565b94505060206125d687828801612385565b935050604085013567ffffffffffffffff8111156125f7576125f66122ef565b5b6126038782880161254b565b925092505092959194509250565b5f8083601f84011261262657612625612399565b5b8235905067ffffffffffffffff8111156126435761264261239d565b5b60208301915083602082028301111561265f5761265e6123a1565b5b9250929050565b5f805f806060858703121561267e5761267d6122eb565b5b5f61268b8782880161234a565b945050602061269c87828801612385565b935050604085013567ffffffffffffffff8111156126bd576126bc6122ef565b5b6126c987828801612611565b925092505092959194509250565b5f8083601f8401126126ec576126eb612399565b5b8235905067ffffffffffffffff8111156127095761270861239d565b5b602083019150836020820283011115612725576127246123a1565b5b9250929050565b5f805f8060608587031215612744576127436122eb565b5b5f6127518782880161234a565b945050602061276287828801612385565b935050604085013567ffffffffffffffff811115612783576127826122ef565b5b61278f878288016126d7565b925092505092959194509250565b5f8083601f8401126127b2576127b1612399565b5b8235905067ffffffffffffffff8111156127cf576127ce61239d565b5b6020830191508360208202830111156127eb576127ea6123a1565b5b9250929050565b5f805f806060858703121561280a576128096122eb565b5b5f6128178782880161234a565b945050602061282887828801612385565b935050604085013567ffffffffffffffff811115612849576128486122ef565b5b6128558782880161279d565b925092505092959194509250565b5f8083601f84011261287857612877612399565b5b8235905067ffffffffffffffff8111156128955761289461239d565b5b6020830191508360208202830111156128b1576128b06123a1565b5b9250929050565b5f805f80606085870312156128d0576128cf6122eb565b5b5f6128dd8782880161234a565b94505060206128ee87828801612385565b935050604085013567ffffffffffffffff81111561290f5761290e6122ef565b5b61291b87828801612863565b925092505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f823560016101200383360303811261297e5761297d612956565b5b80830191505092915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6129ae8161298a565b81146129b8575f80fd5b50565b5f813590506129c9816129a5565b92915050565b5f602082840312156129e4576129e36122eb565b5b5f6129f1848285016129bb565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612a3081612312565b8114612a3a575f80fd5b50565b5f81359050612a4b81612a27565b92915050565b5f60208284031215612a6657612a656122eb565b5b5f612a7384828501612a3d565b91505092915050565b5f8115159050919050565b612a9081612a7c565b8114612a9a575f80fd5b50565b5f81359050612aab81612a87565b92915050565b5f60208284031215612ac657612ac56122eb565b5b5f612ad384828501612a9d565b91505092915050565b5f8083356001602003843603038112612af857612af7612956565b5b80840192508235915067ffffffffffffffff821115612b1a57612b1961295a565b5b602083019250600182023603831315612b3657612b3561295e565b5b509250929050565b5f80fd5b5f601f19601f8301169050919050565b612b5b82612b42565b810181811067ffffffffffffffff82111715612b7a57612b796129fa565b5b80604052505050565b5f612b8c6122e2565b9050612b988282612b52565b919050565b612ba681612494565b8114612bb0575f80fd5b50565b5f81359050612bc181612b9d565b92915050565b5f60408284031215612bdc57612bdb612b3e565b5b612be66040612b83565b90505f612bf584828501612a3d565b5f830152506020612c0884828501612bb3565b60208301525092915050565b5f60408284031215612c2957612c286122eb565b5b5f612c3684828501612bc7565b91505092915050565b5f8083356001602003843603038112612c5b57612c5a612956565b5b80840192508235915067ffffffffffffffff821115612c7d57612c7c61295a565b5b602083019250604082023603831315612c9957612c9861295e565b5b509250929050565b612caa81612312565b82525050565b612cb98161298a565b82525050565b5f819050919050565b5f612ce2612cdd612cd8846122f3565b612cbf565b6122f3565b9050919050565b5f612cf382612cc8565b9050919050565b5f612d0482612ce9565b9050919050565b612d1481612cfa565b82525050565b612d2381612a7c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612d60578082015181840152602081019050612d45565b5f8484015250505050565b5f612d7582612d29565b612d7f8185612d33565b9350612d8f818560208601612d43565b612d9881612b42565b840191505092915050565b5f612dbd612db8612db384612494565b612cbf565b612494565b9050919050565b612dcd81612da3565b82525050565b604082015f820151612de75f850182612ca1565b506020820151612dfa6020850182612dc4565b50505050565b5f61012083015f830151612e165f860182612ca1565b506020830151612e296020860182612ca1565b506040830151612e3c6040860182612cb0565b506060830151612e4f6060860182612d0b565b506080830151612e626080860182612d1a565b5060a0830151612e7560a0860182612d1a565b5060c083015184820360c0860152612e8d8282612d6b565b91505060e0830151612ea260e0860182612dd3565b508091505092915050565b5f82825260208201905092915050565b5f819050919050565b5f612ed460208401846129bb565b905092915050565b5f64ffffffffff82169050919050565b612ef581612edc565b8114612eff575f80fd5b50565b5f81359050612f1081612eec565b92915050565b5f612f246020840184612f02565b905092915050565b612f3581612edc565b82525050565b60408201612f4b5f830183612ec6565b612f575f850182612cb0565b50612f656020830183612f16565b612f726020850182612f2c565b50505050565b5f612f838383612f3b565b60408301905092915050565b5f82905092915050565b5f604082019050919050565b5f612fb08385612ead565b9350612fbb82612ebd565b805f5b85811015612ff357612fd08284612f8f565b612fda8882612f78565b9750612fe583612f99565b925050600181019050612fbe565b5085925050509392505050565b5f6040820190508181035f8301526130188186612e00565b9050818103602083015261302d818486612fa5565b9050949350505050565b61304081612494565b811461304a575f80fd5b50565b5f8151905061305b81613037565b92915050565b5f60208284031215613076576130756122eb565b5b5f6130838482850161304d565b91505092915050565b5f82356001610140038336030381126130a8576130a7612956565b5b80830191505092915050565b5f80833560016020038436030381126130d0576130cf612956565b5b80840192508235915067ffffffffffffffff8211156130f2576130f161295a565b5b60208301925060608202360383131561310e5761310d61295e565b5b509250929050565b5f6020828403121561312b5761312a6122eb565b5b5f61313884828501612f02565b91505092915050565b604082015f8201516131555f850182612f2c565b5060208201516131686020850182612f2c565b50505050565b5f61016083015f8301516131845f860182612ca1565b5060208301516131976020860182612ca1565b5060408301516131aa6040860182612cb0565b5060608301516131bd6060860182612d0b565b5060808301516131d06080860182612d1a565b5060a08301516131e360a0860182612d1a565b5060c08301516131f660c0860182613141565b5060e083015184820361010086015261320f8282612d6b565b915050610100830151613226610120860182612dd3565b508091505092915050565b5f82825260208201905092915050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b6132668161324a565b8114613270575f80fd5b50565b5f813590506132818161325d565b92915050565b5f6132956020840184613273565b905092915050565b5f6132b76132b26132ad8461324a565b612cbf565b61324a565b9050919050565b6132c78161329d565b82525050565b606082016132dd5f830183612ec6565b6132e95f850182612cb0565b506132f76020830183613287565b61330460208501826132be565b506133126040830183612f16565b61331f6040850182612f2c565b50505050565b5f61333083836132cd565b60608301905092915050565b5f82905092915050565b5f606082019050919050565b5f61335d8385613231565b935061336882613241565b805f5b858110156133a05761337d828461333c565b6133878882613325565b975061339283613346565b92505060018101905061336b565b5085925050509392505050565b5f6040820190508181035f8301526133c5818661316e565b905081810360208301526133da818486613352565b9050949350505050565b5f8235600161014003833603038112613400576133ff612956565b5b80830191505092915050565b5f808335600160200384360303811261342857613427612956565b5b80840192508235915067ffffffffffffffff82111561344a5761344961295a565b5b6020830192506040820236038313156134665761346561295e565b5b509250929050565b5f82825260208201905092915050565b5f819050919050565b604082016134975f830183612ec6565b6134a35f850182612cb0565b506134b16020830183612f16565b6134be6020850182612f2c565b50505050565b5f6134cf8383613487565b60408301905092915050565b5f82905092915050565b5f604082019050919050565b5f6134fc838561346e565b93506135078261347e565b805f5b8581101561353f5761351c82846134db565b61352688826134c4565b9750613531836134e5565b92505060018101905061350a565b5085925050509392505050565b5f6040820190508181035f830152613564818661316e565b905081810360208301526135798184866134f1565b9050949350505050565b5f823560016101a00383360303811261359f5761359e612956565b5b80830191505092915050565b5f604082840312156135c0576135bf612b3e565b5b6135ca6040612b83565b90505f6135d984828501612f02565b5f8301525060206135ec84828501612f02565b60208301525092915050565b5f6040828403121561360d5761360c6122eb565b5b5f61361a848285016135ab565b91505092915050565b604082016136335f830183612ec6565b61363f5f850182612cb0565b5061364d6020830183612ec6565b61365a6020850182612cb0565b50505050565b61366981612edc565b82525050565b5f6080820190508181035f830152613687818661316e565b90506136966020830185613623565b6136a36060830184613660565b949350505050565b5f82356001610180038336030381126136c7576136c6612956565b5b80830191505092915050565b604082016136e35f830183612f16565b6136ef5f850182612f2c565b506136fd6020830183612f16565b61370a6020850182612f2c565b50505050565b5f60a0820190508181035f8301526137288186612e00565b90506137376020830185613623565b61374460608301846136d3565b949350505050565b5f823560016101200383360303811261376857613767612956565b5b80830191505092915050565b5f80833560016020038436030381126137905761378f612956565b5b80840192508235915067ffffffffffffffff8211156137b2576137b161295a565b5b6020830192506060820236038313156137ce576137cd61295e565b5b509250929050565b5f82825260208201905092915050565b5f819050919050565b606082016137ff5f830183612ec6565b61380b5f850182612cb0565b506138196020830183613287565b61382660208501826132be565b506138346040830183612f16565b6138416040850182612f2c565b50505050565b5f61385283836137ef565b60608301905092915050565b5f82905092915050565b5f606082019050919050565b5f61387f83856137d6565b935061388a826137e6565b805f5b858110156138c25761389f828461385e565b6138a98882613847565b97506138b483613868565b92505060018101905061388d565b5085925050509392505050565b5f6040820190508181035f8301526138e78186612e00565b905081810360208301526138fc818486613874565b9050949350505050565b61390f81612312565b82525050565b61391e81612494565b82525050565b5f6060820190506139375f830186613906565b6139446020830185613906565b6139516040830184613915565b949350505050565b5f60408201905061396c5f830185613906565b6139796020830184613906565b9392505050565b5f8151905061398e81612a87565b92915050565b5f602082840312156139a9576139a86122eb565b5b5f6139b684828501613980565b91505092915050565b5f6020820190506139d25f830184613906565b92915050565b5f6040820190506139eb5f830185613906565b6139f86020830184613915565b9392505050565b5f819050919050565b5f613a22613a1d613a18846139ff565b612cbf565b612494565b9050919050565b613a3281613a08565b82525050565b5f604082019050613a4b5f830185613906565b613a586020830184613a29565b9392505050565b5f81519050919050565b5f81905092915050565b5f613a7d82613a5f565b613a878185613a69565b9350613a97818560208601612d43565b80840191505092915050565b5f613aae8284613a73565b91508190509291505056fea164736f6c634300081a000a"; bytes public constant BYTECODE_LOCKUP = - hex"60c0604052346103ce576164916060813803918261001c816103d2565b9384928339810103126103ce5780516001600160a01b038116908190036103ce5760208201516001600160a01b03811692908390036103ce576040015161006360406103d2565b92601284527114d8589b1a595c88131bd8dadd5c0813919560721b602085015261008d60406103d2565b600a81526905341422d4c4f434b55560b41b6020820152306080525f80546001600160a01b031916851781559093907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a383516001600160401b0381116102df57600154600181811c911680156103c4575b60208210146102c157601f8111610361575b50602094601f82116001146102fe579481929394955f926102f3575b50508160011b915f199060031b1c1916176001555b82516001600160401b0381116102df57600254600181811c911680156102d5575b60208210146102c157601f811161025e575b506020601f82116001146101fb57819293945f926101f0575b50508160011b915f199060031b1c1916176002555b600880546001600160a01b03191691909117905560a052600160075560405161609990816103f8823960805181614818015260a0518181816121fc01528181614a0a01526153c40152f35b015190505f80610190565b601f1982169060025f52805f20915f5b8181106102465750958360019596971061022e575b505050811b016002556101a5565b01515f1960f88460031b161c191690555f8080610220565b9192602060018192868b01518155019401920161020b565b60025f527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f830160051c810191602084106102b7575b601f0160051c01905b8181106102ac5750610177565b5f815560010161029f565b9091508190610296565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610165565b634e487b7160e01b5f52604160045260245ffd5b015190505f8061012f565b601f1982169560015f52805f20915f5b88811061034957508360019596979810610331575b505050811b01600155610144565b01515f1960f88460031b161c191690555f8080610323565b9192602060018192868501518155019401920161030e565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f830160051c810191602084106103ba575b601f0160051c01905b8181106103af5750610113565b5f81556001016103a2565b9091508190610399565b90607f1690610101565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176102df5760405256fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714613a0057508063027b6744146139de57806306fdde0314613923578063081812fc14613905578063095ea7b3146138005780631400ecec1461374f5780631b1a433f1461366f5780631c1cdd4c1461360b5780631e897afb146135265780631e99d5691461350957806323b872dd146134f2578063303acc85146134b5578063406887cb1461334657806340e58ee514613082578063425d30dd1461303257806342842e0e1461300957806342966c6814612e4257806342e94a7b14612b7b5780634426757014612b555780634857501f14612ae45780634869e12d14612aaa5780634cc55e11146127165780636352211e1461245c5780636611ceab1461248b5780636d0cee751461245c57806370a08231146123f2578063727b3b0a1461228d57806375829def1461221f57806377163c1d146121e5578063780a82c8146121765780637b73dd9d146120e25780637cad6cd1146120055780637de6b1db14611ecb5780637f5799f914611db75780638659c27014611a125780638f69b993146119925780639067b6771461194357806395d89b411461183b578063a22cb46514611787578063a80fc07114611736578063ad35efd4146116eb578063ad7628cd14611575578063b256456914611525578063b637b865146113fe578063b88d4fde14611374578063b8a3be661461133f578063b971302a146112f1578063bc2be1be146112a2578063c156a11d14610e96578063c87b56dd14610d8b578063d4dbd20b14610d3a578063d511609f14610cef578063d6a03d3114610c19578063d975dfed14610bce578063df2a848c14610af3578063e6c417eb14610a88578063e985e9c514610a2f578063ea5ead19146106ff578063eac8f5b8146106ae578063f590c17614610652578063f851a4401461062d5763fdd46d60146102c6575f80fd5b34610629576060366003190112610629576004356102e2613b2d565b906044356001600160801b038116809103610629576102ff61480e565b815f52600a60205260ff600160405f20015460a81c161561061657815f52600a60205260ff600160405f20015460a01c16610603576001600160a01b03831680156105f057825f5260036020526001600160a01b0360405f2054169384821415806105df575b6105c55782156105b2576001600160801b0361038085615e84565b168084116105985750835f52600a60205282600260405f20015460801c016001600160801b038111610584576103df90855f52600a602052600260405f2001906001600160801b036001600160801b031983549260801b169116179055565b835f52600a6020526103f6600260405f20016151f8565b6001600160801b0361041a8160208401511692826040818351169201511690613e09565b161115610552575b835f52600a602052610446836001600160a01b03600160405f200154169283615eaa565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d6020604051878152a45f8051602061606d8339815191526020604051858152a1833314158061053c575b61049957005b604051926392b9102b60e01b84526004840152336024840152604483015260648201526020816084815f865af1908115610531576392b9102b60e01b916001600160e01b0319915f91610502575b5016036104f057005b635f3a039d60e01b5f5260045260245ffd5b610524915060203d60201161052a575b61051c8183613d87565b810190614406565b5f6104e7565b503d610512565b6040513d5f823e3d90fd5b50835f52600960205260ff60405f205416610493565b5f848152600a6020526040902060018101805460ff60a01b1916600160a01b179055805460ff60f01b19169055610422565b634e487b7160e01b5f52601160045260245ffd5b8385632176546160e01b5f5260045260245260445260645ffd5b83633dd1eadf60e21b5f5260045260245ffd5b50826297d0a360e61b5f526004523360245260445260645ffd5b506105ea858561522a565b15610365565b826316c90d2760e21b5f5260045260245ffd5b5063449491f560e11b5f5260045260245ffd5b50631643770160e21b5f5260045260245ffd5b5f80fd5b34610629575f3660031901126106295760206001600160a01b035f5416604051908152f35b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c575f52600a602052602060405f205460f81c6040519015158152f35b631643770160e21b5f5260045260245ffd5b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c575f52600a60205260206001600160a01b03600160405f20015416604051908152f35b346106295760403660031901126106295760043561071b613b2d565b61072482615e84565b9161072d61480e565b805f52600a60205260ff600160405f20015460a81c161561069c57805f52600a60205260ff600160405f20015460a01c16610a1d576001600160a01b0382168015610a0a57815f5260036020526001600160a01b0360405f2054169384821415806109f9575b6109df576001600160801b03169283156109cc576001600160801b036107b884615e84565b168085116109b25750825f52600a60205283600260405f20015460801c016001600160801b0381116105845761081790845f52600a602052600260405f2001906001600160801b036001600160801b031983549260801b169116179055565b825f52600a60205261082e600260405f20016151f8565b6001600160801b036108528160208401511692826040818351169201511690613e09565b161115610980575b825f52600a60205261087e846001600160a01b03600160405f200154169283615eaa565b81837f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d6020604051888152a45f8051602061606d8339815191526020604051848152a1833314158061096a575b6108db575b602083604051908152f35b604051916392b9102b60e01b8352600483015233602483015260448201528160648201526020816084815f875af1908115610531576392b9102b60e01b916001600160e01b0319915f9161094b575b5016036109385781806108d0565b50635f3a039d60e01b5f5260045260245ffd5b610964915060203d60201161052a5761051c8183613d87565b8561092a565b50835f52600960205260ff60405f2054166108cb565b5f838152600a6020526040902060018101805460ff60a01b1916600160a01b179055805460ff60f01b1916905561085a565b8484632176546160e01b5f5260045260245260445260645ffd5b82633dd1eadf60e21b5f5260045260245ffd5b50906297d0a360e61b5f526004523360245260445260645ffd5b50610a04858461522a565b15610793565b506316c90d2760e21b5f5260045260245ffd5b63449491f560e11b5f5260045260245ffd5b3461062957604036600319011261062957610a48613b17565b6001600160a01b03610a58613b2d565b91165f5260066020526001600160a01b0360405f2091165f52602052602060ff60405f2054166040519015158152f35b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c575f52600a60205260ff600160405f20015460b81c166040516003821015610adf576020918152f35b634e487b7160e01b5f52602160045260245ffd5b3461062957602036600319011261062957600435610b0f6143ee565b50805f52600a60205260ff600160405f20015460a81c161561069c57805f52600a60205260ff600160405f20015460b81c166003811015610adf57610b9e575f52600e6020526040805f20815190610b6682613d14565b546001600160801b038116825260801c6020820152610b9c825180926001600160801b0360208092828151168552015116910152565bf35b5f52600a602052610bc560ff600160405f20015460b81c16637382cd8b60e01b5f52613dc5565b5f60245260445ffd5b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c57610c08602091615e84565b6001600160801b0360405191168152f35b3461062957366003190161016081126106295761014013610629576101443567ffffffffffffffff811161062957610c55903690600401613bdf565b610c5d61480e565b610c6636613e62565b90610c7081613f82565b92610c7e6040519485613d87565b818452602084019160061b81019036821161062957915b818310610cb0576020610ca88686615311565b604051908152f35b6040833603126106295760206040918251610cca81613d14565b610cd386613dd3565b8152610ce0838701613c10565b83820152815201920191610c95565b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c575f52600a6020526020600260405f20015460801c604051908152f35b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c575f52600a60205260206001600160801b03600360405f20015416604051908152f35b3461062957602036600319011261062957600435610da881614426565b505f6001600160a01b0360085416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa8015610531575f90610e19575b610e1590604051918291602083526020830190613af2565b0390f35b503d805f833e610e298183613d87565b8101906020818303126106295780519067ffffffffffffffff821161062957019080601f8301121561062957815191610e6183613da9565b91610e6f6040519384613d87565b8383526020848301011161062957610e1592610e919160208085019101613ad1565b610dfd565b3461062957604036600319011261062957600435610eb2613b2d565b610eba61480e565b815f52600a60205260ff600160405f20015460a81c161561061657815f5260036020526001600160a01b0360405f20541690610ef6828461522a565b1561128b576001600160801b03610f0c84615e84565b169081158015610f95575b506001600160a01b03811615610f8257610f39846001600160a01b03926150d1565b169182610f535783637e27328960e01b5f5260045260245ffd5b8084918403610f6757602083604051908152f35b9091506364283d7b60e01b5f5260045260245260445260645ffd5b633250574960e11b5f525f60045260245ffd5b610f9d61480e565b845f52600a60205260ff600160405f20015460a81c161561127857845f52600a60205260ff600160405f20015460a01c1661126557831561125257845f5260036020526001600160a01b0360405f205416908185141580611241575b61122757611214576001600160801b0361101286615e84565b168084116111fa5750845f52600a60205282600260405f20015460801c016001600160801b0381116105845761107190865f52600a602052600260405f2001906001600160801b036001600160801b031983549260801b169116179055565b845f52600a602052611088600260405f20016151f8565b6001600160801b036110ac8160208401511692826040818351169201511690613e09565b1611156111c8575b845f52600a6020526001600160a01b03600160405f200154166110d8848683615eaa565b84867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d6020604051888152a45f8051602061606d8339815191526020604051878152a180331415806111b2575b15610f17576040516392b9102b60e01b81528560048201523360248201528460448201528360648201526020816084815f865af1908115610531576392b9102b60e01b916001600160e01b0319915f91611193575b501614610f1757635f3a039d60e01b5f5260045260245ffd5b6111ac915060203d60201161052a5761051c8183613d87565b8861117a565b50805f52600960205260ff60405f205416611125565b5f858152600a6020526040902060018101805460ff60a01b1916600160a01b179055805460ff60f01b191690556110b4565b8386632176546160e01b5f5260045260245260445260645ffd5b84633dd1eadf60e21b5f5260045260245ffd5b84866297d0a360e61b5f526004523360245260445260645ffd5b5061124c828761522a565b15610ff9565b846316c90d2760e21b5f5260045260245ffd5b8463449491f560e11b5f5260045260245ffd5b84631643770160e21b5f5260045260245ffd5b82634dda2c3960e11b5f526004523360245260445ffd5b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c575f52600a602052602064ffffffffff60405f205460a01c16604051908152f35b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c575f52600a60205260206001600160a01b0360405f205416604051908152f35b34610629576020366003190112610629576004355f52600a602052602060ff600160405f20015460a81c166040519015158152f35b346106295760803660031901126106295761138d613b17565b611395613b2d565b6064359167ffffffffffffffff83116106295736602384011215610629578260040135916113c283613da9565b926113d06040519485613d87565b8084523660248287010111610629576020815f9260246113fc98018388013785010152604435916142fe565b005b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c57805f52600a60205260ff600160405f20015460b81c166003811015610adf576001036114f4575f52600c60205260405f20805461146981613f82565b916114776040519384613d87565b81835260208301905f5260205f205f915b8383106114a55760405160208082528190610e1590820188613c79565b6001602081926040516114b781613ce4565b64ffffffffff86546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c166040820152815201920192019190611488565b5f52600a60205261151b60ff600160405f20015460b81c16637382cd8b60e01b5f52613dc5565b600160245260445ffd5b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c575f52600a602052602060ff600160405f20015460b01c166040519015158152f35b34610629573660031901610180811261062957610100136106295760403661010319011261062957604036610143190112610629576115b261480e565b6040514264ffffffffff166115c682613d14565b808252602082015f81525f9164ffffffffff6115e06142e9565b166116d2575b6101643564ffffffffff81168103610629570164ffffffffff16905261160a614263565b91611613614279565b61161b61428f565b6001600160a01b0361162b6142a5565b6001600160801b0361163b6142bb565b93836116456142ca565b96816040519b6116548d613d30565b168b521660208a015216604088015216606086015215156080850152151560a084015260c083015261168536613e29565b60e08301526040519061169782613d14565b610104356001600160801b038116810361062957825261012435916001600160801b038316830361062957602093610ca893858301526158af565b915064ffffffffff6116e26142e9565b830116916115e6565b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c576117239061503d565b6040516005821015610adf576020918152f35b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c575f52600a60205260206001600160801b03600260405f20015416604051908152f35b34610629576040366003190112610629576117a0613b17565b60243590811515809203610629576001600160a01b031690811561180f57335f52600660205260405f20825f5260205260405f2060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b507f5b08ba18000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b34610629575f366003190112610629576040515f6002548060011c90600181168015611939575b6020831081146119255782855290811561190157506001146118a3575b610e158361188f81850382613d87565b604051918291602083526020830190613af2565b91905060025f527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace915f905b8082106118e75750909150810160200161188f61187f565b9192600181602092548385880101520191019092916118cf565b60ff191660208086019190915291151560051b8401909101915061188f905061187f565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611862565b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c575f52600a602052602064ffffffffff60405f205460c81c16604051908152f35b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c576119ca9061503d565b600581101580610adf5760028214908115611a06575b81156119f4575b6020826040519015158152f35b9050610adf57600460209114826119e7565b5050600381145f6119e0565b346106295760203660031901126106295760043567ffffffffffffffff811161062957611a43903690600401613b74565b90611a4c61480e565b5f915b808310611a5857005b611a638382846142d9565b3592611a6d61480e565b835f52600a60205260ff600160405f20015460a81c1615611da457835f52600a60205260ff600160405f20015460a01c165f14611ab7578363449491f560e11b5f5260045260245ffd5b909192805f52600a60205260405f205460f81c611d9257611aec815f52600a6020526001600160a01b0360405f205416331490565b15611d7c57611afa81614447565b90805f52600a602052611b12600260405f20016151f8565b916001600160801b038351166001600160801b0382161015611d6957815f52600a60205260ff60405f205460f01c1615611d5657806001600160801b03602081611b66948188511603169501511690613e09565b5f828152600a6020526040902080547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b179055916001600160801b038316908115611d31575b825f52600a602052600360405f20016001600160801b0382166001600160801b0319825416179055825f52600a6020526001600160a01b0360405f205416835f5260036020526001600160a01b0360405f20541694845f52600a60205285827f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50611c786001600160a01b03600160405f2001541694611c50888588615eaa565b604080518b81526001600160801b03808b166020830152909216908201529081906060820190565b0390a45f8051602061606d8339815191526020604051868152a1845f52600960205260ff60405f205416611cb6575b50505050506001019190611a4f565b60405193630d4af11f60e31b855260048501526024840152604483015260648201526020816084815f865af190811561053157630d4af11f60e31b916001600160e01b0319915f91611d13575b5016036104f05780808080611ca7565b611d2b915060203d811161052a5761051c8183613d87565b87611d03565b825f52600a602052600160405f2001600160a01b60ff60a01b19825416179055611bb0565b50635c7470b760e01b5f5260045260245ffd5b5063fa36c71760e01b5f5260045260245ffd5b634dda2c3960e11b5f526004523360245260445ffd5b63e707ae4f60e01b5f5260045260245ffd5b83631643770160e21b5f5260045260245ffd5b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c57805f52600a60205260ff600160405f20015460b81c166003811015610adf57600203611e9a575f52600d60205260405f208054611e2281613f82565b91611e306040519384613d87565b81835260208301905f5260205f205f915b838310611e5e5760405160208082528190610e1590820188613c22565b600160208192604051611e7081613d14565b64ffffffffff86546001600160801b038116835260801c1683820152815201920192019190611e41565b5f52600a602052611ec160ff600160405f20015460b81c16637382cd8b60e01b5f52613dc5565b600260245260445ffd5b3461062957602036600319011261062957600435611ee761480e565b805f52600a60205260ff600160405f20015460a81c161561069c57611f0b8161503d565b6005811015610adf5760048103611f2f575063449491f560e11b5f5260045260245ffd5b60038103611f4a575063e707ae4f60e01b5f5260045260245ffd5b600214611ff357611f6f815f52600a6020526001600160a01b0360405f205416331490565b15611d7c57805f52600a60205260ff60405f205460f01c1615611fe1576020815f8051602061606d833981519152925f52600a825260405f2060ff60f01b19815416905560405190807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f5f80a28152a1005b635c7470b760e01b5f5260045260245ffd5b63fa36c71760e01b5f5260045260245ffd5b34610629576020366003190112610629576004356001600160a01b038116809103610629576001600160a01b035f54163381036120cc575060085490806001600160a01b03198316176008556001600160a01b036040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26007545f1981019081116105845760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b6331b339a960e21b5f526004523360245260445ffd5b346106295736600319016101a08112610629576101401361062957604036610143190112610629576101843564ffffffffff811681036106295761212461480e565b61212d36613e62565b906040519061213b82613d14565b610144356001600160801b038116810361062957825261016435916001600160801b038316830361062957602093610ca893858301526158af565b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c57805f52600a60205260ff600160405f20015460b81c166003811015610adf57610b9e575f52600b602052602064ffffffffff60405f205416604051908152f35b34610629575f3660031901126106295760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461062957602036600319011261062957612238613b17565b5f546001600160a01b0381163381036120cc57506001600160a01b036001600160a01b0319921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b346106295760203660031901126106295760043567ffffffffffffffff8111610629576122be903690600401613b74565b906122c761480e565b5f915b8083106122d357005b6122de8382846142d9565b35926122e861480e565b835f52600a60205260ff600160405f20015460a81c1615611da45761230c8461503d565b6005811015610adf5760048103612330578463449491f560e11b5f5260045260245ffd5b6003810361234b578463e707ae4f60e01b5f5260045260245ffd5b92939192909190600214611ff357612377815f52600a6020526001600160a01b0360405f205416331490565b15611d7c57805f52600a60205260ff60405f205460f01c1615611fe157905f8051602061606d8339815191526020836001945f52600a825260405f2060ff60f01b19815416905560405190807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f5f80a28152a10191906122ca565b34610629576020366003190112610629576001600160a01b03612413613b17565b168015612430575f526004602052602060405f2054604051908152f35b7f89c62b64000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b3461062957602036600319011261062957602061247a600435614426565b6001600160a01b0360405191168152f35b3461062957366003190161012081126106295761010013610629576101043567ffffffffffffffff8111610629576124c7903690600401613bdf565b6124cf61480e565b6040519182917f66f401dd000000000000000000000000000000000000000000000000000000008352806024840160206004860152526044830191905f5b8181106126d257845f8180870381737715be116061e014bb721b46dc78dd57c91fdf9b5af4908115610531575f91612610575b5080515f198101908111610584578164ffffffffff6020612565610ca894829661423b565b510151166040519061257682613d14565b64ffffffffff421682528482015261258c614263565b90612595614279565b61259d61428f565b6001600160a01b036125ad6142a5565b6001600160801b036125bd6142bb565b93836125c76142ca565b96816040519a6125d68c613d30565b168a52168b89015216604087015216606085015215156080840152151560a083015260c082015261260636613e29565b60e0820152615311565b90503d805f833e6126218183613d87565b8101906020818303126106295780519067ffffffffffffffff8211610629570181601f820112156106295780519061265882613f82565b926126666040519485613d87565b82845260208085019360061b8301019181831161062957602001925b828410612693575050505081612540565b60408483031261062957602060409182516126ad81613d14565b6126b687614215565b81526126c3838801614229565b83820152815201930192612682565b919350916040806001926001600160801b036126ed88613dd3565b16815264ffffffffff61270260208901613c10565b16602082015201940191019184939261250d565b346106295760403660031901126106295760043567ffffffffffffffff811161062957612747903690600401613b74565b60243567ffffffffffffffff811161062957612767903690600401613b74565b61277293919361480e565b808303612a7b575f5b83811061278457005b61278f8185856142d9565b3561279b8286866142d9565b355f5260036020526001600160a01b0360405f205416906127bd8385896142d9565b356001600160801b0381169081810361062957506127d961480e565b815f52600a60205260ff600160405f20015460a81c161561061657815f52600a60205260ff600160405f20015460a01c16610603578215610a0a57815f5260036020526001600160a01b0360405f205416928381141580612a6a575b612a515781156109cc576001600160801b0361285084615e84565b16808311612a375750825f52600a60205281600260405f20015460801c016001600160801b038111610584576128af90845f52600a602052600260405f2001906001600160801b036001600160801b031983549260801b169116179055565b825f52600a6020526128c6600260405f20016151f8565b6001600160801b036128ea8160208401511692826040818351169201511690613e09565b161115612a05575b825f52600a6020526001600160a01b03600160405f20015416612916838383615eaa565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d6020604051878152a45f8051602061606d8339815191526020604051858152a183331415806129ef575b612974575b5050505060010161277b565b604051926392b9102b60e01b84526004840152336024840152604483015260648201526020816084815f865af1908115610531576392b9102b60e01b916001600160e01b0319915f916129d1575b5016036104f057808080612968565b6129e9915060203d811161052a5761051c8183613d87565b896129c2565b50835f52600960205260ff60405f205416612963565b5f838152600a6020526040902060018101805460ff60a01b1916600160a01b179055805460ff60f01b191690556128f2565b8284632176546160e01b5f5260045260245260445260645ffd5b826297d0a360e61b5f526004523360245260445260645ffd5b50612a75848461522a565b15612835565b827fc0a1a35a000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c57610c08602091615290565b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c575f612b1d8261503d565b6005811015610adf57600203612b3b575b6020906040519015158152f35b505f52600a602052602060ff60405f205460f01c16612b2e565b34610629575f3660031901126106295760206001600160a01b0360085416604051908152f35b3461062957366003190161012081126106295761010013610629576101043567ffffffffffffffff811161062957612bb7903690600401613b43565b612bbf61480e565b6040519182917fca31a854000000000000000000000000000000000000000000000000000000008352806024840160206004860152526044830191905f5b818110612de357845f8180870381737715be116061e014bb721b46dc78dd57c91fdf9b5af4908115610531575f91612d01575b5080515f198101908111610584578164ffffffffff6040612c56610ca89460209661423b565b5101511660405190612c6782613d14565b64ffffffffff4216825284820152612c7d614263565b90612c86614279565b612c8e61428f565b6001600160a01b03612c9e6142a5565b6001600160801b03612cae6142bb565b9383612cb86142ca565b96816040519a612cc78c613d30565b168a52168b89015216604087015216606085015215156080840152151560a083015260c0820152612cf736613e29565b60e0820152614957565b90503d805f833e612d128183613d87565b8101906020818303126106295780519067ffffffffffffffff8211610629570181601f8201121561062957805190612d4982613f82565b92612d576040519485613d87565b8284526020606081860194028301019181831161062957602001925b828410612d84575050505081612c30565b6060848303126106295760405190612d9b82613ce4565b612da485614215565b825260208501519067ffffffffffffffff821682036106295782602092836060950152612dd360408801614229565b6040820152815201930192612d73565b919350916060806001926001600160801b03612dfe88613dd3565b16815267ffffffffffffffff612e1660208901613f9a565b16602082015264ffffffffff612e2e60408901613c10565b166040820152019401910191849392612bfd565b3461062957602036600319011261062957600435612e5e61480e565b805f52600a60205260ff600160405f20015460a81c161561069c57805f52600a60205260ff600160405f20015460a01c1615612fde57805f526003602052612eb36001600160a01b0360405f2054168261522a565b15611d7c57805f5260036020526001600160a01b0360405f205416151580612fd7575b80612fba575b612fa8575f8051602061606d8339815191526020604051838152a1805f5260036020526001600160a01b0360405f2054168015908115612f71575b825f52600360205260405f206001600160a01b03198154169055825f827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a450612f5f57005b637e27328960e01b5f5260045260245ffd5b612f90835f52600560205260405f206001600160a01b03198154169055565b805f52600460205260405f205f198154019055612f17565b6349d74b1160e11b5f5260045260245ffd5b50805f52600a60205260ff600160405f20015460b01c1615612edc565b505f612ed6565b7fa6ba32da000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b34610629576113fc61301a36613ba5565b906040519261302a602085613d87565b5f84526142fe565b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c575f52600a602052602060ff600160405f20015460a01c166040519015158152f35b346106295760203660031901126106295760043561309e61480e565b805f52600a60205260ff600160405f20015460a81c161561069c57805f52600a60205260ff600160405f20015460a01c165f146130e75763449491f560e11b5f5260045260245ffd5b805f52600a60205260405f205460f81c611d9257613119815f52600a6020526001600160a01b0360405f205416331490565b15611d7c5761312781614447565b90805f52600a60205261313f600260405f20016151f8565b916001600160801b038351166001600160801b0382161015611d6957815f52600a60205260ff60405f205460f01c1615611d5657806001600160801b03602081613193948188511603169501511690613e09565b5f828152600a6020526040902080547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b179055916001600160801b038316908115613321575b825f52600a602052600360405f20016001600160801b0382166001600160801b0319825416179055825f52600a6020526001600160a01b0360405f205416835f5260036020526001600160a01b0360405f20541694845f52600a60205285827f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5061327d6001600160a01b03600160405f2001541694611c50888588615eaa565b0390a45f8051602061606d8339815191526020604051868152a1845f52600960205260ff60405f2054166132ad57005b60405193630d4af11f60e31b855260048501526024840152604483015260648201526020816084815f865af190811561053157630d4af11f60e31b916001600160e01b0319915f91613302575016036104f057005b61331b915060203d60201161052a5761051c8183613d87565b846104e7565b825f52600a602052600160405f2001600160a01b60ff60a01b198254161790556131dd565b346106295760203660031901126106295761335f613b17565b6001600160a01b035f54169033820361349e57806001600160a01b03913b1561347257166040516301ffc9a760e01b81527ff8ee98d3000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610531575f91613443575b501561341857805f52600960205260405f20600160ff198254161790556040519081527fb4378d4e289cb3f40f4f75a99c9cafa76e3df1c4dc31309babc23dc91bd7280160203392a2005b7f976c0d64000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b613465915060203d60201161346b575b61345d8183613d87565b8101906141fd565b826133cd565b503d613453565b7f65453b0d000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b506331b339a960e21b5f526004523360245260445ffd5b34610629576020366003190112610629576001600160a01b036134d6613b17565b165f526009602052602060ff60405f2054166040519015158152f35b34610629576113fc61350336613ba5565b91613fde565b34610629575f366003190112610629576020600754604051908152f35b346106295760203660031901126106295760043567ffffffffffffffff811161062957613557903690600401613b74565b9036819003601e1901905f5b838110156113fc578060051b8201358381121561062957820180359067ffffffffffffffff821161062957602001813603811361062957815f92918392604051928392833781018381520390305af46135ba613faf565b90156135c95750600101613563565b613607906040519182917fd9354485000000000000000000000000000000000000000000000000000000008352602060048401526024830190613af2565b0390fd5b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c576136439061503d565b6005811015610adf578060209115908115613664575b506040519015158152f35b600191501482613659565b3461062957366003190161016081126106295761014013610629576101443567ffffffffffffffff8111610629576136ab903690600401613b43565b6136b361480e565b6136bc36613e62565b906136c681613f82565b926136d46040519485613d87565b818452606060208501920281019036821161062957915b8183106136fe576020610ca88686614957565b60608336031261062957602060609160405161371981613ce4565b61372286613dd3565b815261372f838701613f9a565b8382015261373f60408701613c10565b60408201528152019201916136eb565b3461062957602036600319011261062957600435805f52600a60205260ff600160405f20015460a81c161561069c576020905f90805f52600a835260ff60405f205460f01c16806137e4575b6137b2575b506001600160801b0360405191168152f35b6137de9150805f52600a83526137d86001600160801b03600260405f2001541691614447565b90613e09565b826137a0565b50805f52600a835260ff600160405f20015460a01c161561379b565b3461062957604036600319011261062957613819613b17565b60243561382581614426565b331515806138f2575b806138bf575b6138935781906001600160a01b0380851691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f80a45f5260056020526001600160a01b0360405f2091166001600160a01b03198254161790555f80f35b7fa9fbf51f000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b506001600160a01b0381165f52600660205260405f206001600160a01b0333165f5260205260ff60405f20541615613834565b50336001600160a01b038216141561382e565b3461062957602036600319011261062957602061247a600435613de7565b34610629575f366003190112610629576040515f6001548060011c906001811680156139d4575b60208310811461192557828552908115611901575060011461397657610e158361188f81850382613d87565b91905060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f905b8082106139ba5750909150810160200161188f61187f565b9192600181602092548385880101520191019092916139a2565b91607f169161394a565b34610629575f36600319011261062957602060405167016345785d8a00008152f35b3461062957602036600319011261062957600435906001600160e01b0319821680920361062957817f490649060000000000000000000000000000000000000000000000000000000060209314908115613a5c575b5015158152f35b7f80ac58cd00000000000000000000000000000000000000000000000000000000811491508115613aa7575b8115613a96575b5083613a55565b6301ffc9a760e01b91501483613a8f565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150613a88565b5f5b838110613ae25750505f910152565b8181015183820152602001613ad3565b90602091613b0b81518092818552858086019101613ad1565b601f01601f1916010190565b600435906001600160a01b038216820361062957565b602435906001600160a01b038216820361062957565b9181601f840112156106295782359167ffffffffffffffff8311610629576020808501946060850201011161062957565b9181601f840112156106295782359167ffffffffffffffff8311610629576020808501948460051b01011161062957565b6060906003190112610629576004356001600160a01b038116810361062957906024356001600160a01b0381168103610629579060443590565b9181601f840112156106295782359167ffffffffffffffff8311610629576020808501948460061b01011161062957565b359064ffffffffff8216820361062957565b90602080835192838152019201905f5b818110613c3f5750505090565b9091926020604082613c6e600194885164ffffffffff602080926001600160801b038151168552015116910152565b019401929101613c32565b90602080835192838152019201905f5b818110613c965750505090565b9091926020606082613cd9600194885164ffffffffff604080926001600160801b03815116855267ffffffffffffffff6020820151166020860152015116910152565b019401929101613c89565b6060810190811067ffffffffffffffff821117613d0057604052565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff821117613d0057604052565b610100810190811067ffffffffffffffff821117613d0057604052565b610120810190811067ffffffffffffffff821117613d0057604052565b610160810190811067ffffffffffffffff821117613d0057604052565b90601f8019910116810190811067ffffffffffffffff821117613d0057604052565b67ffffffffffffffff8111613d0057601f01601f191660200190565b6003811015610adf57600452565b35906001600160801b038216820361062957565b613df081614426565b505f5260056020526001600160a01b0360405f20541690565b906001600160801b03809116911603906001600160801b03821161058457565b60409060c31901126106295760405190613e4282613d14565b8160c4356001600160a01b0381168103610629578152602060e435910152565b9061014060031983011261062957604051613e7c81613d30565b80926004356001600160a01b03811681036106295782526024356001600160a01b03811681036106295760208301526044356001600160801b03811681036106295760408301526064356001600160a01b0381168103610629576060830152608435801515810361062957608083015260a43580151581036106295760a0830152604060c31982011261062957604051613f1581613d14565b60c43564ffffffffff8116810361062957815260e43564ffffffffff8116810361062957602082015260c08301526040610104809203126106295760405191613f5d83613d14565b81356001600160a01b03811681036106295760e0926020918552013560208401520152565b67ffffffffffffffff8111613d005760051b60200190565b359067ffffffffffffffff8216820361062957565b3d15613fd9573d90613fc082613da9565b91613fce6040519384613d87565b82523d5f602084013e565b606090565b91906001600160a01b03168015610f8257815f5260036020526001600160a01b0360405f2054161515806141f5575b806141d8575b6141c5575f8051602061606d8339815191526020604051848152a1815f5260036020526001600160a01b0360405f20541692823315159283614110575b6001600160a01b039350856140d9575b805f52600460205260405f2060018154019055815f52600360205260405f20816001600160a01b0319825416179055857fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4168083036140c157505050565b6364283d7b60e01b5f5260045260245260445260645ffd5b6140f8825f52600560205260405f206001600160a01b03198154169055565b855f52600460205260405f205f198154019055614060565b919290508061416e575b1561412757828291614050565b828461413f57637e27328960e01b5f5260045260245ffd5b7f177e802f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b50338414801561419c575b8061411a5750825f526005602052336001600160a01b0360405f2054161461411a565b50835f52600660205260405f206001600160a01b0333165f5260205260ff60405f205416614179565b506349d74b1160e11b5f5260045260245ffd5b50815f52600a60205260ff600160405f20015460b01c1615614013565b50600161400d565b90816020910312610629575180151581036106295790565b51906001600160801b038216820361062957565b519064ffffffffff8216820361062957565b805182101561424f5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6004356001600160a01b03811681036106295790565b6024356001600160a01b03811681036106295790565b6044356001600160801b03811681036106295790565b6064356001600160a01b03811681036106295790565b60843580151581036106295790565b60a43580151581036106295790565b919081101561424f5760051b0190565b6101443564ffffffffff811681036106295790565b9061430a838284613fde565b803b614317575b50505050565b60209161435d6001600160a01b03809316956040519586948594630a85bd0160e11b86523360048701521660248501526044840152608060648401526084830190613af2565b03815f865af15f91816143cd575b506143995750614379613faf565b805190816143945782633250574960e11b5f5260045260245ffd5b602001fd5b6001600160e01b0319630a85bd0160e11b9116036143bb57505f808080614311565b633250574960e11b5f5260045260245ffd5b6143e791925060203d60201161052a5761051c8183613d87565b905f61436b565b604051906143fb82613d14565b5f6020838281520152565b9081602091031261062957516001600160e01b0319811681036106295790565b805f5260036020526001600160a01b0360405f205416908115612f5f575090565b5f818152600a6020526040908190205490519064ffffffffff60c882901c81169160a01c1661447583613d14565b8083526020830191825264ffffffffff42168091101561480657835f52600a60205264ffffffffff6001600160801b03600260405f200154169251161115614800575f835f52600a60205260ff600160405f20015460b81c166003811015610adf57600181036146195750505090805f52600c60205264ffffffffff60405f20925116905f52600a602052600260405f20015460801c906040519283917f63ec2f5a0000000000000000000000000000000000000000000000000000000083526064830160606004850152825480915260848401925f5260205f20905f5b8181106145d3575050509060209383926024840152604483015203817326f9d826bded47fc472526ae8095b75ac336963c5af4908115610531575f91614599575b505b90565b90506020813d6020116145cb575b816145b460209383613d87565b81010312610629576145c590614215565b5f614594565b3d91506145a7565b82546001600160801b0381168652608081901c67ffffffffffffffff16602087015260c01c64ffffffffff16604086015287955060609094019360019283019201614553565b919391806146f3575050805f52600b60205264ffffffffff60405f205416815f52600e60205260405f20915f52600a6020526146a3600260405f20015460801c93604051957f9465928b0000000000000000000000000000000000000000000000000000000087526004870152602486019064ffffffffff60208092828151168552015116910152565b6064840152546001600160801b038116608484015260801c60a483015260c482015260208160e4817326f9d826bded47fc472526ae8095b75ac336963c5af4908115610531575f91614599575090565b909350600291925014614704575090565b90505f52600d60205260405f2060405180917f5515a8160000000000000000000000000000000000000000000000000000000082526024820160206004840152815480915260448301915f5260205f20905f5b8181106147ce57505050908060209203817326f9d826bded47fc472526ae8095b75ac336963c5af4908115610531575f91614794575b505f614594565b90506020813d6020116147c6575b816147af60209383613d87565b81010312610629576147c090614215565b5f61478d565b3d91506147a2565b82546001600160801b038116855260801c64ffffffffff16602085015285945060409093019260019283019201614757565b91505090565b505050505f90565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361484057565b7fa1c0d6e5000000000000000000000000000000000000000000000000000000005f5260045ffd5b908160409103126106295761489660206040519261488584613d14565b61488e81614215565b845201614215565b602082015290565b805482101561424f575f5260205f2001905f90565b6001600160a01b0361010061014092828151168552826020820151166020860152826040820151166040860152614907606082015160608701906001600160801b0360208092828151168552015116910152565b8260808201511660a086015260a0810151151560c086015260c0810151151560e086015261494f60e08201518387019064ffffffffff60208092828151168552015116910152565b015116910152565b91906001600160a01b03835116906149da60c0850180516001600160801b036040880151169060e0880195602087510151926040519586937ffb6164dd0000000000000000000000000000000000000000000000000000000085526101048501936004860152602485019064ffffffffff60208092828151168552015116910152565b60648301526101006084830152855180915261012482019060208701905f5b818110614fe95750505081906040937f000000000000000000000000000000000000000000000000000000000000000060a484015260c483015267016345785d8a000060e48301520381737715be116061e014bb721b46dc78dd57c91fdf9b5af4918215610531575f92614fb8575b506007549583515f5b818110614ea6575050604051614a8681613d4d565b5f8152602081015f9052604081015f9052604051614aa381613d14565b5f8152602081015f90526060820152608081015f905260a081015f905260c081015f9052604051614ad381613d14565b5f8152602081015f905260e0820152610100015f905280516001600160a01b031693825195865164ffffffffff16966020015164ffffffffff16906080840196875115158b606087019485516001600160a01b031660a089019c8d511515928c516001600160801b03169560405196614b4b88613ce4565b8752602087015f9052604087015f905260405197614b6889613d6a565b885260208801928352604088019182526060880190815260808801905f825260a0890194855260c08901925f845260e08a0194600186526101008b019788526101208b019860018a526101408c019a8b525f52600a60205260405f209a516001600160a01b03166001600160a01b03168b546001600160a01b031916178b5551908a54905160c81b64ffffffffff60c81b169160a01b64ffffffffff60a01b169069ffffffffffffffffffff60a01b191617178955511515614c4190899060ff60f01b1960ff60f01b835492151560f01b169116179055565b5187546001600160f81b031690151560f81b7fff00000000000000000000000000000000000000000000000000000000000000161787559151600187018054935160ff60a01b90151560a01b166001600160a01b0390921674ffffffffffffffffffffffffffffffffffffffffff19909416939093171782555115159381549251151560b01b60ff60b01b169351916003831015610adf5762ffffff60a81b1990931660a89590951b60ff60a81b169490941790921760b89290921b60ff60b81b16919091179055518051602082015160801b6001600160801b0319166001600160801b039182161760028401559060039082906040015116920191166001600160801b031982541617905560208401946001600160a01b038651168015610f8257614d758c6001600160a01b03926150d1565b16614e7a578a987f57d31f8bb3cedf51e9d4ce840aca90a0f5fef3e4269c3dc4b52333edc973429198614e46986001600160a01b038080808f9b6001614e5a9d01600755614dd5828c51166001600160801b038851169030903390615f01565b6001600160801b0360208701511680614e5f575b5051169b511697511692511515935115159451955151169560405199614e0e8b613d4d565b338b5260208b015260408a01526060890152608088015260a087015260c086015260e0850152610100840152604051938480946148b3565b610180610160840152610180830190613c79565b0390a2565b614e7490838d5116848d515116903390615f01565b5f614de9565b7f73c6ac6e000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b885f52600c60205260405f2090614ebd818861423b565b5191805468010000000000000000811015613d0057614ee19160018201815561489e565b614fa557826001600160801b03806001955116166001600160801b03198354161782556020810151907fffffff00000000000000000000000000ffffffffffffffffffffffffffffffff7cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff0000000000000000000000000000000086549560801b1693847fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff8716178755015160c01b1692161717905501614a71565b634e487b7160e01b5f525f60045260245ffd5b614fdb91925060403d604011614fe2575b614fd38183613d87565b810190614868565b905f614a68565b503d614fc9565b9194935091602060608261502e600194895164ffffffffff604080926001600160801b03815116855267ffffffffffffffff6020820151166020860152015116910152565b019501910191869394926149f9565b805f52600a60205260ff600160405f20015460a01c165f1461505f5750600490565b805f52600a60205260405f205460f81c6150cb57805f52600a60205264ffffffffff60405f205460a01c1642106150c65761509981614447565b905f52600a6020526001600160801b0380600260405f200154169116105f146150c157600190565b600290565b505f90565b50600390565b90805f5260036020526001600160a01b0360405f2054161515806151e6575b806151c9575b612fa8575f8051602061606d8339815191526020604051838152a1805f5260036020526001600160a01b038060405f2054169283615192575b168061517a575b815f52600360205260405f20816001600160a01b0319825416179055827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a490565b805f52600460205260405f2060018154019055615136565b6151b1835f52600560205260405f206001600160a01b03198154169055565b835f52600460205260405f205f19815401905561512f565b50805f52600a60205260ff600160405f20015460b01c16156150f6565b506001600160a01b03821615156150f0565b9060405161520581613ce4565b60406001600160801b03600183958054838116865260801c6020860152015416910152565b906001600160a01b031690813314918215615264575b50811561524b575090565b90506001600160a01b0361525f3392613de7565b161490565b9091505f52600660205260405f206001600160a01b0333165f5260205260ff60405f205416905f615240565b805f52600a6020526152a7600260405f20016151f8565b90805f52600a60205260ff600160405f20015460a01c165f146152d55750602001516001600160801b031690565b90815f52600a60205260405f205460f81c6152f4575061459690614447565b61459691506001600160801b036040818351169201511690613e09565b91906001600160a01b038351169061539460c0850180516001600160801b036040880151169060e0880195602087510151926040519586937f07aaee4b0000000000000000000000000000000000000000000000000000000085526101048501936004860152602485019064ffffffffff60208092828151168552015116910152565b60648301526101006084830152855180915261012482019060208701905f5b81811061586f5750505081906040937f000000000000000000000000000000000000000000000000000000000000000060a484015260c483015267016345785d8a000060e48301520381737715be116061e014bb721b46dc78dd57c91fdf9b5af4918215610531575f9261584e575b506007549583515f5b8181106157a357505060405161544081613d4d565b5f8152602081015f9052604081015f905260405161545d81613d14565b5f8152602081015f90526060820152608081015f905260a081015f905260c081015f905260405161548d81613d14565b5f8152602081015f905260e0820152610100015f905280516001600160a01b031693825195865164ffffffffff16966020015164ffffffffff16906080840196875115158b606087019485516001600160a01b031660a089019c8d511515928c516001600160801b0316956040519661550588613ce4565b8752602087015f9052604087015f90526040519761552289613d6a565b885260208801928352604088019182526060880190815260808801905f825260a0890194855260c08901925f845260e08a0194600186526101008b019788526101208b019860028a526101408c019a8b525f52600a60205260405f209a516001600160a01b03166001600160a01b03168b546001600160a01b031916178b5551908a54905160c81b64ffffffffff60c81b169160a01b64ffffffffff60a01b169069ffffffffffffffffffff60a01b1916171789555115156155fb90899060ff60f01b1960ff60f01b835492151560f01b169116179055565b5187546001600160f81b031690151560f81b7fff00000000000000000000000000000000000000000000000000000000000000161787559151600187018054935160ff60a01b90151560a01b166001600160a01b0390921674ffffffffffffffffffffffffffffffffffffffffff19909416939093171782555115159381549251151560b01b60ff60b01b169351916003831015610adf5762ffffff60a81b1990931660a89590951b60ff60a81b169490941790921760b89290921b60ff60b81b16919091179055518051602082015160801b6001600160801b0319166001600160801b039182161760028401559060039082906040015116920191166001600160801b031982541617905560208401946001600160a01b038651168015610f825761572f8c6001600160a01b03926150d1565b16614e7a578a987f3791edd755f0a379ba7622d643751f1fa19ee54a734a43502c4892a34ce8fe719861578f986001600160a01b038080808f9b6001614e5a9d01600755614dd5828c51166001600160801b038851169030903390615f01565b610180610160840152610180830190613c22565b885f52600d60205260405f20906157ba818861423b565b5191805468010000000000000000811015613d00576157de9160018201815561489e565b614fa5576020836001600160801b03806001965116166001600160801b031984541617835501517fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff74ffffffffff0000000000000000000000000000000083549260801b1691161790550161542b565b61586891925060403d604011614fe257614fd38183613d87565b905f615422565b919493509160206040826158a0600194895164ffffffffff602080926001600160801b038151168552015116910152565b019501910191869394926153b3565b929190926001600160a01b0381511660c082018051926001600160801b036040820151169364ffffffffff60e083019661593260208951015193604051977fe7de03ce0000000000000000000000000000000000000000000000000000000089526004890152602488019064ffffffffff60208092828151168552015116910152565b1694856064860152608485015261596160a48501896001600160801b0360208092828151168552015116910152565b60e484015267016345785d8a000061010484015260408361012481737715be116061e014bb721b46dc78dd57c91fdf9b5af4928315610531575f93615e63575b50600754966001600160801b0381511680615e38575b5084615dce575b6040516159ca81613d4d565b5f8152602081015f9052604081015f90526040516159e781613d14565b5f8152602081015f90526060820152608081015f905260a081015f905260c081015f9052604051615a1781613d14565b5f8152602081015f905260e0820152610100015f905281516001600160a01b031694835196875164ffffffffff16976020015164ffffffffff16906080850197885115158c606088019485516001600160a01b031660a08a019d8e511515928d516001600160801b03169560405196615a8f88613ce4565b8752602087015f9052604087015f905260405197615aac89613d6a565b885260208801928352604088019182526060880190815260808801905f825260a0890194855260c08901925f845260e08a0194600186526101008b019788526101208b01985f8a526101408c019a8b525f52600a60205260405f209a516001600160a01b03166001600160a01b03168b546001600160a01b031916178b5551908a54905160c81b64ffffffffff60c81b169160a01b64ffffffffff60a01b169069ffffffffffffffffffff60a01b191617178955511515615b8490899060ff60f01b1960ff60f01b835492151560f01b169116179055565b5187546001600160f81b031690151560f81b7fff00000000000000000000000000000000000000000000000000000000000000161787559151600187018054935160ff60a01b90151560a01b166001600160a01b0390921674ffffffffffffffffffffffffffffffffffffffffff19909416939093171782555115159381549251151560b01b60ff60b01b169351916003831015610adf5762ffffff60a81b1990931660a89590951b60ff60a81b169490941790921760b89290921b60ff60b81b16919091179055518051602082015160801b6001600160801b0319166001600160801b039182161760028401559060039082906040015116920191166001600160801b031982541617905560208501956001600160a01b038751168015610f8257615cb88d6001600160a01b03926150d1565b16614e7a578b997ffab1da036cbdbf2bb53bc19bb2c81ca5819d3b35a0583fa45b5a8401097ce839996101c0996001600160a01b0380808f615db09c6001839201600755615d18828c51166001600160801b038851169030903390615f01565b6001600160801b0360208701511680615db3575b5051169c51169751169251151593511515945195515116956040519a615d518c613d4d565b338c5260208c015260408b015260608a0152608089015260a088015260c087015260e0860152610100850152615d8a60405180956148b3565b6101608401526101808301906001600160801b0360208092828151168552015116910152565ba2565b615dc890838d5116848d515116903390615f01565b5f615d2c565b875f52600b60205260405f208564ffffffffff198254161790556001600160801b0360208201511680615e02575b506159be565b615e3290895f52600e60205260405f20906001600160801b036001600160801b031983549260801b169116179055565b5f615dfc565b885f52600e6020526001600160801b0360405f2091166001600160801b03198254161790555f6159b7565b615e7d91935060403d604011614fe257614fd38183613d87565b915f6159a1565b61459690615e9181615290565b905f52600a602052600260405f20015460801c90613e09565b615eff926001600160a01b03604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252615efa606483613d87565b615f5b565b565b9091926001600160a01b03615eff9481604051957f23b872dd000000000000000000000000000000000000000000000000000000006020880152166024860152166044840152606483015260648252615efa608483613d87565b5f806001600160a01b03615f8493169360208151910182865af1615f7d613faf565b9083615fe0565b8051908115159182615fc5575b5050615f9a5750565b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b615fd892506020809183010191016141fd565b155f80615f91565b9061601d5750805115615ff557805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580616063575b61602e575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b1561602656fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c634300081a000a"; + hex"60c060405234801561000f575f80fd5b5060405161ac3738038061ac37833981810160405281019061003191906102b6565b82826040518060400160405280601281526020017f5361626c696572204c6f636b7570204e465400000000000000000000000000008152506040518060400160405280600a81526020017f5341422d4c4f434b555000000000000000000000000000000000000000000000815250833073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf8060405160405180910390a350816001908161017d9190610537565b50806002908161018d9190610537565b5050508060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508060a081815250506001600781905550505050610606565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610217826101ee565b9050919050565b6102278161020d565b8114610231575f80fd5b50565b5f815190506102428161021e565b92915050565b5f6102528261020d565b9050919050565b61026281610248565b811461026c575f80fd5b50565b5f8151905061027d81610259565b92915050565b5f819050919050565b61029581610283565b811461029f575f80fd5b50565b5f815190506102b08161028c565b92915050565b5f805f606084860312156102cd576102cc6101ea565b5b5f6102da86828701610234565b93505060206102eb8682870161026f565b92505060406102fc868287016102a2565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061038157607f821691505b6020821081036103945761039361033d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103f67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103bb565b61040086836103bb565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61043b61043661043184610283565b610418565b610283565b9050919050565b5f819050919050565b61045483610421565b61046861046082610442565b8484546103c7565b825550505050565b5f90565b61047c610470565b61048781848461044b565b505050565b5b818110156104aa5761049f5f82610474565b60018101905061048d565b5050565b601f8211156104ef576104c08161039a565b6104c9846103ac565b810160208510156104d8578190505b6104ec6104e4856103ac565b83018261048c565b50505b505050565b5f82821c905092915050565b5f61050f5f19846008026104f4565b1980831691505092915050565b5f6105278383610500565b9150826002028217905092915050565b61054082610306565b67ffffffffffffffff81111561055957610558610310565b5b610563825461036a565b61056e8282856104ae565b5f60209050601f83116001811461059f575f841561058d578287015190505b610597858261051c565b8655506105fe565b601f1984166105ad8661039a565b5f5b828110156105d4578489015182556001820191506020850194506020810190506105af565b868310156105f157848901516105ed601f891682610500565b8355505b6001600288020188555050505b505050505050565b60805160a05161a6026106355f395f81816125c101528181614a100152615bb801525f61458d015261a6025ff3fe6080604052600436106103b6575f3560e01c80637cad6cd1116101f1578063b971302a1161010c578063deecd64f1161009f578063ea5ead191161006e578063ea5ead1914610f28578063f590c17614610f58578063f851a44014610f94578063fdd46d6014610fbe576103b6565b8063deecd64f14610e44578063df2a848c14610e74578063e6c417eb14610eb0578063e985e9c514610eec576103b6565b8063c87b56dd116100db578063c87b56dd14610d54578063d4dbd20b14610d90578063d511609f14610dcc578063d975dfed14610e08576103b6565b8063b971302a14610c96578063bc2be1be14610cd2578063c156a11d14610d0e578063c879657214610d3e576103b6565b8063a22cb46511610184578063b256456911610153578063b256456914610bba578063b637b86514610bf6578063b88d4fde14610c32578063b8a3be6614610c5a576103b6565b8063a22cb46514610ade578063a477577214610b06578063a80fc07114610b42578063ad35efd414610b7e576103b6565b80638659c270116101c05780638659c27014610a205780638f69b99314610a3c5780639067b67714610a7857806395d89b4114610ab4576103b6565b80637cad6cd1146109705780637de6b1db146109985780637ee21391146109b45780637f5799f9146109e4576103b6565b806340e58ee5116102e15780636352211e1161027457806375829def1161024357806375829def146108b257806377163c1d146108da578063780a82c8146109045780637a69584114610940576103b6565b80636352211e146107e25780636d0cee751461081e57806370a082311461085a578063727b3b0a14610896576103b6565b806344267570116102b057806344267570146107245780634857501f1461074e5780634869e12d1461078a5780634cc55e11146107c6576103b6565b806340e58ee514610688578063425d30dd146106a457806342842e0e146106e057806342966c6814610708576103b6565b80631400ecec1161035957806322bc0a801161032857806322bc0a80146105cc57806323b872dd146105fc578063303acc8514610624578063406887cb14610660576103b6565b80631400ecec1461050e5780631c1cdd4c1461054a5780631e897afb146105865780631e99d569146105a2576103b6565b806306fdde031161039557806306fdde0314610450578063081812fc1461047a578063095ea7b3146104b65780630aef4433146104de576103b6565b8062dba286146103ba57806301ffc9a7146103ea578063027b674414610426575b5f80fd5b6103d460048036038101906103cf9190617660565b610fda565b6040516103e191906176e4565b60405180910390f35b3480156103f5575f80fd5b50610410600480360381019061040b9190617752565b611201565b60405161041d9190617797565b60405180910390f35b348015610431575f80fd5b5061043a611242565b60405161044791906177e9565b60405180910390f35b34801561045b575f80fd5b5061046461124e565b604051610471919061788c565b60405180910390f35b348015610485575f80fd5b506104a0600480360381019061049b91906178d6565b6112de565b6040516104ad9190617940565b60405180910390f35b3480156104c1575f80fd5b506104dc60048036038101906104d79190617983565b6112f9565b005b6104f860048036038101906104f39190617a22565b61130f565b60405161050591906176e4565b60405180910390f35b348015610519575f80fd5b50610534600480360381019061052f91906178d6565b611562565b6040516105419190617ac5565b60405180910390f35b348015610555575f80fd5b50610570600480360381019061056b91906178d6565b611666565b60405161057d9190617797565b60405180910390f35b6105a0600480360381019061059b9190617b33565b611736565b005b3480156105ad575f80fd5b506105b661182a565b6040516105c391906176e4565b60405180910390f35b6105e660048036038101906105e19190617bf2565b611830565b6040516105f391906176e4565b60405180910390f35b348015610607575f80fd5b50610622600480360381019061061d9190617c6b565b6118aa565b005b34801561062f575f80fd5b5061064a60048036038101906106459190617cbb565b6119a9565b6040516106579190617797565b60405180910390f35b34801561066b575f80fd5b5061068660048036038101906106819190617cbb565b6119fb565b005b6106a2600480360381019061069d91906178d6565b611c8a565b005b3480156106af575f80fd5b506106ca60048036038101906106c591906178d6565b611e16565b6040516106d79190617797565b60405180910390f35b3480156106eb575f80fd5b5061070660048036038101906107019190617c6b565b611ea5565b005b610722600480360381019061071d91906178d6565b611ec4565b005b34801561072f575f80fd5b50610738611ffa565b6040516107459190617d38565b60405180910390f35b348015610759575f80fd5b50610774600480360381019061076f91906178d6565b61201f565b6040516107819190617797565b60405180910390f35b348015610795575f80fd5b506107b060048036038101906107ab91906178d6565b6120e2565b6040516107bd9190617ac5565b60405180910390f35b6107e060048036038101906107db9190617dfb565b612158565b005b3480156107ed575f80fd5b50610808600480360381019061080391906178d6565b61234f565b6040516108159190617940565b60405180910390f35b348015610829575f80fd5b50610844600480360381019061083f91906178d6565b612360565b6040516108519190617940565b60405180910390f35b348015610865575f80fd5b50610880600480360381019061087b9190617cbb565b612371565b60405161088d91906176e4565b60405180910390f35b6108b060048036038101906108ab9190617e79565b612427565b005b3480156108bd575f80fd5b506108d860048036038101906108d39190617cbb565b612473565b005b3480156108e5575f80fd5b506108ee6125bf565b6040516108fb91906176e4565b60405180910390f35b34801561090f575f80fd5b5061092a600480360381019061092591906178d6565b6125e3565b6040516109379190617ee3565b60405180910390f35b61095a60048036038101906109559190617f26565b61271e565b60405161096791906176e4565b60405180910390f35b34801561097b575f80fd5b5061099660048036038101906109919190617fcd565b612754565b005b6109b260048036038101906109ad91906178d6565b612904565b005b6109ce60048036038101906109c9919061804d565b612b74565b6040516109db91906176e4565b60405180910390f35b3480156109ef575f80fd5b50610a0a6004803603810190610a0591906178d6565b612bee565b604051610a1791906181b9565b60405180910390f35b610a3a6004803603810190610a359190617e79565b612dd9565b005b348015610a47575f80fd5b50610a626004803603810190610a5d91906178d6565b612e25565b604051610a6f9190617797565b60405180910390f35b348015610a83575f80fd5b50610a9e6004803603810190610a9991906178d6565b612f24565b604051610aab9190617ee3565b60405180910390f35b348015610abf575f80fd5b50610ac8612fb6565b604051610ad5919061788c565b60405180910390f35b348015610ae9575f80fd5b50610b046004803603810190610aff9190618203565b613046565b005b348015610b11575f80fd5b50610b2c6004803603810190610b2791906178d6565b61305c565b604051610b399190618261565b60405180910390f35b348015610b4d575f80fd5b50610b686004803603810190610b6391906178d6565b6130fd565b604051610b759190617ac5565b60405180910390f35b348015610b89575f80fd5b50610ba46004803603810190610b9f91906178d6565b61319c565b604051610bb191906182ed565b60405180910390f35b348015610bc5575f80fd5b50610be06004803603810190610bdb91906178d6565b613212565b604051610bed9190617797565b60405180910390f35b348015610c01575f80fd5b50610c1c6004803603810190610c1791906178d6565b6132a1565b604051610c299190618431565b60405180910390f35b348015610c3d575f80fd5b50610c586004803603810190610c539190618579565b6134be565b005b348015610c65575f80fd5b50610c806004803603810190610c7b91906178d6565b6134db565b604051610c8d9190617797565b60405180910390f35b348015610ca1575f80fd5b50610cbc6004803603810190610cb791906178d6565b613505565b604051610cc99190617940565b60405180910390f35b348015610cdd575f80fd5b50610cf86004803603810190610cf391906178d6565b6135a5565b604051610d059190617ee3565b60405180910390f35b610d286004803603810190610d2391906185f9565b613637565b604051610d359190617ac5565b60405180910390f35b348015610d49575f80fd5b50610d52613741565b005b348015610d5f575f80fd5b50610d7a6004803603810190610d7591906178d6565b613897565b604051610d87919061788c565b60405180910390f35b348015610d9b575f80fd5b50610db66004803603810190610db191906178d6565b613948565b604051610dc39190617ac5565b60405180910390f35b348015610dd7575f80fd5b50610df26004803603810190610ded91906178d6565b6139e8565b604051610dff9190617ac5565b60405180910390f35b348015610e13575f80fd5b50610e2e6004803603810190610e2991906178d6565b613a88565b604051610e3b9190617ac5565b60405180910390f35b610e5e6004803603810190610e59919061868c565b613afe565b604051610e6b91906176e4565b60405180910390f35b348015610e7f575f80fd5b50610e9a6004803603810190610e9591906178d6565b613d51565b604051610ea79190618732565b60405180910390f35b348015610ebb575f80fd5b50610ed66004803603810190610ed191906178d6565b613f1e565b604051610ee39190618791565b60405180910390f35b348015610ef7575f80fd5b50610f126004803603810190610f0d91906187aa565b613fad565b604051610f1f9190617797565b60405180910390f35b610f426004803603810190610f3d91906185f9565b61403b565b604051610f4f9190617ac5565b60405180910390f35b348015610f63575f80fd5b50610f7e6004803603810190610f7991906178d6565b614058565b604051610f8b9190617797565b60405180910390f35b348015610f9f575f80fd5b50610fa86140e6565b604051610fb59190617940565b60405180910390f35b610fd86004803603810190610fd39190618812565b614109565b005b5f610fe361458b565b5f60405180604001604052804264ffffffffff1681526020015f64ffffffffff1681525090505f80845f01602081019061101d9190618862565b64ffffffffff16111561104457835f01602081019061103c9190618862565b825f01510190505b8360200160208101906110579190618862565b825f015101826020019064ffffffffff16908164ffffffffff16815250506111f6604051806101200160405280885f0160208101906110969190617cbb565b73ffffffffffffffffffffffffffffffffffffffff1681526020018860200160208101906110c49190617cbb565b73ffffffffffffffffffffffffffffffffffffffff1681526020018860400160208101906110f2919061888d565b6fffffffffffffffffffffffffffffffff16815260200188606001602081019061111c91906188f3565b73ffffffffffffffffffffffffffffffffffffffff16815260200188608001602081019061114a919061891e565b151581526020018860a0016020810190611164919061891e565b15158152602001848152602001888060c001906111819190618955565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081526020018860e0018036038101906111dc9190618a36565b815250868036038101906111f09190618aae565b83614612565b925050509392505050565b5f634906490660e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061123b575061123a8261482a565b5b9050919050565b67016345785d8a000081565b60606001805461125d90618b06565b80601f016020809104026020016040519081016040528092919081815260200182805461128990618b06565b80156112d45780601f106112ab576101008083540402835291602001916112d4565b820191905f5260205f20905b8154815290600101906020018083116112b757829003601f168201915b5050505050905090565b5f6112e88261490b565b506112f282614991565b9050919050565b61130b82826113066149ca565b6149d1565b5050565b5f61131861458b565b5f737715be116061e014bb721b46dc78dd57c91fdf9b63ca31a85485856040518363ffffffff1660e01b8152600401611352929190618cc8565b5f60405180830381865af415801561136c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906113949190618e47565b90505f60405180604001604052804264ffffffffff16815260200183600185516113be9190618ebb565b815181106113cf576113ce618eee565b5b60200260200101516040015164ffffffffff168152509050611557604051806101200160405280885f0160208101906114089190617cbb565b73ffffffffffffffffffffffffffffffffffffffff1681526020018860200160208101906114369190617cbb565b73ffffffffffffffffffffffffffffffffffffffff168152602001886040016020810190611464919061888d565b6fffffffffffffffffffffffffffffffff16815260200188606001602081019061148e91906188f3565b73ffffffffffffffffffffffffffffffffffffffff1681526020018860800160208101906114bc919061891e565b151581526020018860a00160208101906114d6919061891e565b15158152602001838152602001888060c001906114f39190618955565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081526020018860e00180360381019061154e9190618a36565b815250836149e3565b925050509392505050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff166115c757806040517f590ddc040000000000000000000000000000000000000000000000000000000081526004016115be91906176e4565b60405180910390fd5b600a5f8481526020019081526020015f205f01601e9054906101000a900460ff1680156116135750600a5f8481526020019081526020015f2060010160149054906101000a900460ff16155b156116605761162183614bff565b600a5f8581526020019081526020015f206002015f015f9054906101000a90046fffffffffffffffffffffffffffffffff1661165d9190618f1b565b91505b50919050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff166116cb57806040517f590ddc040000000000000000000000000000000000000000000000000000000081526004016116c291906176e4565b60405180910390fd5b5f6116d584614fdc565b90505f60048111156116ea576116e961827a565b5b8160048111156116fd576116fc61827a565b5b148061172d5750600160048111156117185761171761827a565b5b81600481111561172b5761172a61827a565b5b145b92505050919050565b5f8282905090505f5b81811015611824575f803073ffffffffffffffffffffffffffffffffffffffff1686868581811061177357611772618eee565b5b90506020028101906117859190618f5e565b604051611793929190618fee565b5f60405180830381855af49150503d805f81146117cb576040519150601f19603f3d011682016040523d82523d5f602084013e6117d0565b606091505b50915091508161181757806040517fd935448500000000000000000000000000000000000000000000000000000000815260040161180e9190619058565b60405180910390fd5b505080600101905061173f565b50505050565b60075481565b5f61183961458b565b6118a1846118469061925d565b8484808060200260200160405190810160405280939291908181526020015f905b828210156118975784848390506060020180360381019061188891906192d0565b81526020019060010190611867565b50505050506149e3565b90509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361191a575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016119119190617940565b60405180910390fd5b5f61192d83836119286149ca565b6150ef565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119a3578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161199a939291906192fb565b60405180910390fd5b50505050565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611aab575f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff16336040517fc6cce6a4000000000000000000000000000000000000000000000000000000008152600401611aa2929190619330565b60405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff163b03611b0657806040517f65453b0d000000000000000000000000000000000000000000000000000000008152600401611afd9190617940565b60405180910390fd5b5f7ff8ee98d30000000000000000000000000000000000000000000000000000000090508173ffffffffffffffffffffffffffffffffffffffff166301ffc9a7826040518263ffffffff1660e01b8152600401611b639190619366565b602060405180830381865afa158015611b7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba29190619393565b611be357816040517f976c0d64000000000000000000000000000000000000000000000000000000008152600401611bda9190617940565b60405180910390fd5b600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fb4378d4e289cb3f40f4f75a99c9cafa76e3df1c4dc31309babc23dc91bd7280183604051611c7e9190617940565b60405180910390a25050565b611c9261458b565b80600a5f8281526020019081526020015f2060010160159054906101000a900460ff16611cf657806040517f590ddc04000000000000000000000000000000000000000000000000000000008152600401611ced91906176e4565b60405180910390fd5b600a5f8381526020019081526020015f2060010160149054906101000a900460ff1615611d5a57816040517f892923ea000000000000000000000000000000000000000000000000000000008152600401611d5191906176e4565b60405180910390fd5b600a5f8381526020019081526020015f205f01601f9054906101000a900460ff1615611dbd57816040517fe707ae4f000000000000000000000000000000000000000000000000000000008152600401611db491906176e4565b60405180910390fd5b611dc68261521d565b611e095781336040517f9bb45872000000000000000000000000000000000000000000000000000000008152600401611e009291906193be565b60405180910390fd5b611e1282615286565b5050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff16611e7b57806040517f590ddc04000000000000000000000000000000000000000000000000000000008152600401611e7291906176e4565b60405180910390fd5b600a5f8481526020019081526020015f2060010160149054906101000a900460ff16915050919050565b611ebf83838360405180602001604052805f8152506134be565b505050565b611ecc61458b565b80600a5f8281526020019081526020015f2060010160159054906101000a900460ff16611f3057806040517f590ddc04000000000000000000000000000000000000000000000000000000008152600401611f2791906176e4565b60405180910390fd5b600a5f8381526020019081526020015f2060010160149054906101000a900460ff16611f9357816040517fa6ba32da000000000000000000000000000000000000000000000000000000008152600401611f8a91906176e4565b60405180910390fd5b5f611f9d83615835565b9050611fa9838261586e565b611fec5782336040517f9bb45872000000000000000000000000000000000000000000000000000000008152600401611fe39291906193be565b60405180910390fd5b611ff5836158f5565b505050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff1661208457806040517f590ddc0400000000000000000000000000000000000000000000000000000000815260040161207b91906176e4565b60405180910390fd5b600260048111156120985761209761827a565b5b6120a184614fdc565b60048111156120b3576120b261827a565b5b146120dc57600a5f8481526020019081526020015f205f01601e9054906101000a900460ff1691505b50919050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff1661214757806040517f590ddc0400000000000000000000000000000000000000000000000000000000815260040161213e91906176e4565b60405180910390fd5b61215083615977565b915050919050565b61216061458b565b5f8484905090505f8383905090508082146121b45781816040517fc0a1a35a0000000000000000000000000000000000000000000000000000000081526004016121ab9291906193e5565b60405180910390fd5b5f5b82811015612346575f803073ffffffffffffffffffffffffffffffffffffffff168989858181106121ea576121e9618eee565b5b905060200201356122138b8b8781811061220757612206618eee565b5b90506020020135615835565b89898781811061222657612225618eee565b5b905060200201602081019061223b919061888d565b60405160240161224d9392919061940c565b60405160208183030381529060405263fdd46d6060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161229f9190619471565b5f60405180830381855af49150503d805f81146122d7576040519150601f19603f3d011682016040523d82523d5f602084013e6122dc565b606091505b509150915081612339577f36b7a9a3f5bfe69ad6ae04107796a967de5c92c761b4d7a4c34e98567066641989898581811061231a57612319618eee565b5b9050602002013582604051612330929190619487565b60405180910390a15b50508060010190506121b6565b50505050505050565b5f6123598261490b565b9050919050565b5f61236a8261490b565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123e2575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016123d99190617940565b60405180910390fd5b60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61242f61458b565b5f8282905090505f5b8181101561246d5761246284848381811061245657612455618eee565b5b90506020020135612904565b806001019050612438565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612523575f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff16336040517fc6cce6a400000000000000000000000000000000000000000000000000000000815260040161251a929190619330565b60405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf8060405160405180910390a350565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff1661264857806040517f590ddc0400000000000000000000000000000000000000000000000000000000815260040161263f91906176e4565b60405180910390fd5b5f600281111561265b5761265a61827a565b5b600a5f8581526020019081526020015f2060010160179054906101000a900460ff16600281111561268f5761268e61827a565b5b146126f457600a5f8481526020019081526020015f2060010160179054906101000a900460ff165f6040517f7382cd8b0000000000000000000000000000000000000000000000000000000081526004016126eb9291906194b5565b60405180910390fd5b600b5f8481526020019081526020015f205f9054906101000a900464ffffffffff16915050919050565b5f61272761458b565b61274b846127349061925d565b848036038101906127459190618aae565b84614612565b90509392505050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612804575f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff16336040517fc6cce6a40000000000000000000000000000000000000000000000000000000081526004016127fb929190619330565b60405180910390fd5b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc82846040516128b19291906194dc565b60405180910390a27f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c6001806007546128ea9190618ebb565b6040516128f892919061953c565b60405180910390a15050565b61290c61458b565b80600a5f8281526020019081526020015f2060010160159054906101000a900460ff1661297057806040517f590ddc0400000000000000000000000000000000000000000000000000000000815260040161296791906176e4565b60405180910390fd5b5f61297a83614fdc565b905060048081111561298f5761298e61827a565b5b8160048111156129a2576129a161827a565b5b036129e457826040517f892923ea0000000000000000000000000000000000000000000000000000000081526004016129db91906176e4565b60405180910390fd5b600360048111156129f8576129f761827a565b5b816004811115612a0b57612a0a61827a565b5b03612a4d57826040517fe707ae4f000000000000000000000000000000000000000000000000000000008152600401612a4491906176e4565b60405180910390fd5b60026004811115612a6157612a6061827a565b5b816004811115612a7457612a7361827a565b5b03612ab657826040517ffa36c717000000000000000000000000000000000000000000000000000000008152600401612aad91906176e4565b60405180910390fd5b612abf8361521d565b612b025782336040517f9bb45872000000000000000000000000000000000000000000000000000000008152600401612af99291906193be565b60405180910390fd5b612b0b83615afb565b827f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f60405160405180910390a27ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce783604051612b6791906176e4565b60405180910390a1505050565b5f612b7d61458b565b612be584612b8a9061925d565b8484808060200260200160405190810160405280939291908181526020015f905b82821015612bdb57848483905060400201803603810190612bcc91906195b0565b81526020019060010190612bab565b5050505050615b8b565b90509392505050565b606081600a5f8281526020019081526020015f2060010160159054906101000a900460ff16612c5457806040517f590ddc04000000000000000000000000000000000000000000000000000000008152600401612c4b91906176e4565b60405180910390fd5b600280811115612c6757612c6661827a565b5b600a5f8581526020019081526020015f2060010160179054906101000a900460ff166002811115612c9b57612c9a61827a565b5b14612d0157600a5f8481526020019081526020015f2060010160179054906101000a900460ff1660026040517f7382cd8b000000000000000000000000000000000000000000000000000000008152600401612cf89291906194b5565b60405180910390fd5b600d5f8481526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b82821015612dcd578382905f5260205f20016040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900464ffffffffff1664ffffffffff1664ffffffffff168152505081526020019060010190612d31565b50505050915050919050565b612de161458b565b5f8282905090505f5b81811015612e1f57612e14848483818110612e0857612e07618eee565b5b90506020020135611c8a565b806001019050612dea565b50505050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff16612e8a57806040517f590ddc04000000000000000000000000000000000000000000000000000000008152600401612e8191906176e4565b60405180910390fd5b5f612e9484614fdc565b905060026004811115612eaa57612ea961827a565b5b816004811115612ebd57612ebc61827a565b5b1480612eed575060036004811115612ed857612ed761827a565b5b816004811115612eeb57612eea61827a565b5b145b80612f1b5750600480811115612f0657612f0561827a565b5b816004811115612f1957612f1861827a565b5b145b92505050919050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff16612f8957806040517f590ddc04000000000000000000000000000000000000000000000000000000008152600401612f8091906176e4565b60405180910390fd5b600a5f8481526020019081526020015f205f0160199054906101000a900464ffffffffff16915050919050565b606060028054612fc590618b06565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff190618b06565b801561303c5780601f106130135761010080835404028352916020019161303c565b820191905f5260205f20905b81548152906001019060200180831161301f57829003601f168201915b5050505050905090565b6130586130516149ca565b8383615d79565b5050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff166130c157806040517f590ddc040000000000000000000000000000000000000000000000000000000081526004016130b891906176e4565b60405180910390fd5b600a5f8481526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff1661316257806040517f590ddc0400000000000000000000000000000000000000000000000000000000815260040161315991906176e4565b60405180910390fd5b600a5f8481526020019081526020015f206002015f015f9054906101000a90046fffffffffffffffffffffffffffffffff16915050919050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff1661320157806040517f590ddc040000000000000000000000000000000000000000000000000000000081526004016131f891906176e4565b60405180910390fd5b61320a83614fdc565b915050919050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff1661327757806040517f590ddc0400000000000000000000000000000000000000000000000000000000815260040161326e91906176e4565b60405180910390fd5b600a5f8481526020019081526020015f2060010160169054906101000a900460ff16915050919050565b606081600a5f8281526020019081526020015f2060010160159054906101000a900460ff1661330757806040517f590ddc040000000000000000000000000000000000000000000000000000000081526004016132fe91906176e4565b60405180910390fd5b6001600281111561331b5761331a61827a565b5b600a5f8581526020019081526020015f2060010160179054906101000a900460ff16600281111561334f5761334e61827a565b5b146133b557600a5f8481526020019081526020015f2060010160179054906101000a900460ff1660016040517f7382cd8b0000000000000000000000000000000000000000000000000000000081526004016133ac9291906194b5565b60405180910390fd5b600c5f8481526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b828210156134b2578382905f5260205f20016040518060600160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f820160189054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681525050815260200190600101906133e5565b50505050915050919050565b6134c98484846118aa565b6134d584848484615ee2565b50505050565b5f600a5f8381526020019081526020015f2060010160159054906101000a900460ff169050919050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff1661356a57806040517f590ddc0400000000000000000000000000000000000000000000000000000000815260040161356191906176e4565b60405180910390fd5b600a5f8481526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff1661360a57806040517f590ddc0400000000000000000000000000000000000000000000000000000000815260040161360191906176e4565b60405180910390fd5b600a5f8481526020019081526020015f205f0160149054906101000a900464ffffffffff16915050919050565b5f61364061458b565b82600a5f8281526020019081526020015f2060010160159054906101000a900460ff166136a457806040517f590ddc0400000000000000000000000000000000000000000000000000000000815260040161369b91906176e4565b60405180910390fd5b5f6136ae85615835565b90506136ba858261586e565b6136fd5784336040517f9bb458720000000000000000000000000000000000000000000000000000000081526004016136f49291906193be565b60405180910390fd5b61370685616094565b92505f836fffffffffffffffffffffffffffffffff16111561372e5761372d858285614109565b5b6137398185876160e2565b505092915050565b5f4790505f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161378a906195fe565b5f6040518083038185875af1925050503d805f81146137c4576040519150601f19603f3d011682016040523d82523d5f602084013e6137c9565b606091505b5050905080613830575f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040517fdf68418d000000000000000000000000000000000000000000000000000000008152600401613827929190619612565b60405180910390fd5b815f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fc9a0214d4c5fed6341233260a7bc0c9ac1d712cc5882165fa985bb71d4f207ae60405160405180910390a35050565b60606138a28261490b565b5060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e9dc637530846040518363ffffffff1660e01b81526004016138ff929190619659565b5f60405180830381865afa158015613919573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061394191906196ee565b9050919050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff166139ad57806040517f590ddc040000000000000000000000000000000000000000000000000000000081526004016139a491906176e4565b60405180910390fd5b600a5f8481526020019081526020015f206002016001015f9054906101000a90046fffffffffffffffffffffffffffffffff16915050919050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff16613a4d57806040517f590ddc04000000000000000000000000000000000000000000000000000000008152600401613a4491906176e4565b60405180910390fd5b600a5f8481526020019081526020015f206002015f0160109054906101000a90046fffffffffffffffffffffffffffffffff16915050919050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff16613aed57806040517f590ddc04000000000000000000000000000000000000000000000000000000008152600401613ae491906176e4565b60405180910390fd5b613af683616094565b915050919050565b5f613b0761458b565b5f737715be116061e014bb721b46dc78dd57c91fdf9b6366f401dd85856040518363ffffffff1660e01b8152600401613b41929190619813565b5f60405180830381865af4158015613b5b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190613b839190619942565b90505f60405180604001604052804264ffffffffff1681526020018360018551613bad9190618ebb565b81518110613bbe57613bbd618eee565b5b60200260200101516020015164ffffffffff168152509050613d46604051806101200160405280885f016020810190613bf79190617cbb565b73ffffffffffffffffffffffffffffffffffffffff168152602001886020016020810190613c259190617cbb565b73ffffffffffffffffffffffffffffffffffffffff168152602001886040016020810190613c53919061888d565b6fffffffffffffffffffffffffffffffff168152602001886060016020810190613c7d91906188f3565b73ffffffffffffffffffffffffffffffffffffffff168152602001886080016020810190613cab919061891e565b151581526020018860a0016020810190613cc5919061891e565b15158152602001838152602001888060c00190613ce29190618955565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081526020018860e001803603810190613d3d9190618a36565b81525083615b8b565b925050509392505050565b613d59617488565b81600a5f8281526020019081526020015f2060010160159054906101000a900460ff16613dbd57806040517f590ddc04000000000000000000000000000000000000000000000000000000008152600401613db491906176e4565b60405180910390fd5b5f6002811115613dd057613dcf61827a565b5b600a5f8581526020019081526020015f2060010160179054906101000a900460ff166002811115613e0457613e0361827a565b5b14613e6957600a5f8481526020019081526020015f2060010160179054906101000a900460ff165f6040517f7382cd8b000000000000000000000000000000000000000000000000000000008152600401613e609291906194b5565b60405180910390fd5b600e5f8481526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050915050919050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff16613f8357806040517f590ddc04000000000000000000000000000000000000000000000000000000008152600401613f7a91906176e4565b60405180910390fd5b600a5f8481526020019081526020015f2060010160179054906101000a900460ff16915050919050565b5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f61404583616094565b9050614052838383614109565b92915050565b5f81600a5f8281526020019081526020015f2060010160159054906101000a900460ff166140bd57806040517f590ddc040000000000000000000000000000000000000000000000000000000081526004016140b491906176e4565b60405180910390fd5b600a5f8481526020019081526020015f205f01601f9054906101000a900460ff16915050919050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61411161458b565b82600a5f8281526020019081526020015f2060010160159054906101000a900460ff1661417557806040517f590ddc0400000000000000000000000000000000000000000000000000000000815260040161416c91906176e4565b60405180910390fd5b600a5f8581526020019081526020015f2060010160149054906101000a900460ff16156141d957836040517f892923ea0000000000000000000000000000000000000000000000000000000081526004016141d091906176e4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361424957836040517f5b24349c00000000000000000000000000000000000000000000000000000000815260040161424091906176e4565b60405180910390fd5b5f61425385615835565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156142985750614296858261586e565b155b156142de578433856040517f25f428c00000000000000000000000000000000000000000000000000000000081526004016142d593929190619989565b60405180910390fd5b5f836fffffffffffffffffffffffffffffffff160361433457846040517ff747ab7c00000000000000000000000000000000000000000000000000000000815260040161432b91906176e4565b60405180910390fd5b5f61433e86616094565b9050806fffffffffffffffffffffffffffffffff16846fffffffffffffffffffffffffffffffff1611156143ad578584826040517f217654610000000000000000000000000000000000000000000000000000000081526004016143a4939291906199be565b60405180910390fd5b6143b886868661624a565b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7866040516143e791906176e4565b60405180910390a18173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015614471575060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15614583575f8273ffffffffffffffffffffffffffffffffffffffff166392b9102b883389896040518563ffffffff1660e01b81526004016144b694939291906199f3565b6020604051808303815f875af11580156144d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144f69190619a4a565b90506392b9102b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461458157826040517f5f3a039d0000000000000000000000000000000000000000000000000000000081526004016145789190617940565b60405180910390fd5b505b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614614610576040517fa1c0d6e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f80737715be116061e014bb721b46dc78dd57c91fdf9b63cec85a90865f01518760c00151868960400151898b6101000151602001518c60e0015167016345785d8a00006040518963ffffffff1660e01b8152600401614679989796959493929190619b53565b6040805180830381865af4158015614693573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146b79190619c25565b905060075491505f845f01516fffffffffffffffffffffffffffffffff16111561472857835f0151600e5f8481526020019081526020015f205f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505b5f8364ffffffffff1611156147d65782600b5f8481526020019081526020015f205f6101000a81548164ffffffffff021916908364ffffffffff1602179055505f84602001516fffffffffffffffffffffffffffffffff1611156147d5578360200151600e5f8481526020019081526020015f205f0160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505b5b5f6147e38387845f61654b565b9050827fcf6da1cdefbf0f0870377128cab020f3b9895ce9613b14b933bbd193d764a92e82868860405161481993929190619df7565b60405180910390a250509392505050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806148f457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614904575061490382616a9a565b5b9050919050565b5f8061491683615835565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361498857826040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161497f91906176e4565b60405180910390fd5b80915050919050565b5f60055f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b6149de8383836001616b03565b505050565b5f80737715be116061e014bb721b46dc78dd57c91fdf9b63e68812b4855f01518660c001518760400151877f00000000000000000000000000000000000000000000000000000000000000008a6101000151602001518b60e0015167016345785d8a00006040518963ffffffff1660e01b8152600401614a6a989796959493929190619f05565b6040805180830381865af4158015614a84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614aa89190619c25565b905060075491505f835190505f5b81811015614bab57600c5f8581526020019081526020015f20858281518110614ae257614ae1618eee565b5b6020026020010151908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506040820151815f0160186101000a81548164ffffffffff021916908364ffffffffff1602179055505050806001019050614ab6565b505f614bba848785600161654b565b9050837f7cb83640a329cb238b531daa26ffca31b59dd7c51020184cb4394ac43a11278c8287604051614bee929190619f90565b60405180910390a250505092915050565b5f806040518060400160405280600a5f8681526020019081526020015f205f0160149054906101000a900464ffffffffff1664ffffffffff168152602001600a5f8681526020019081526020015f205f0160199054906101000a900464ffffffffff1664ffffffffff1681525090505f4290508064ffffffffff16825f015164ffffffffff1610614c94575f92505050614fd7565b5f600a5f8681526020019081526020015f206002015f015f9054906101000a90046fffffffffffffffffffffffffffffffff1690508164ffffffffff16836020015164ffffffffff1611614ced57809350505050614fd7565b5f80600a5f8881526020019081526020015f2060010160179054906101000a900460ff16905060016002811115614d2757614d2661827a565b5b816002811115614d3a57614d3961827a565b5b03614e05577326f9d826bded47fc472526ae8095b75ac336963c6363ec2f5a600c5f8a81526020019081526020015f20875f0151600a5f8c81526020019081526020015f206002015f0160109054906101000a90046fffffffffffffffffffffffffffffffff166040518463ffffffff1660e01b8152600401614dbf9392919061a160565b602060405180830381865af4158015614dda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614dfe919061a19c565b9150614fce565b5f6002811115614e1857614e1761827a565b5b816002811115614e2b57614e2a61827a565b5b03614f18577326f9d826bded47fc472526ae8095b75ac336963c639465928b8487600b5f8c81526020019081526020015f205f9054906101000a900464ffffffffff16600e5f8d81526020019081526020015f20600a5f8e81526020019081526020015f206002015f0160109054906101000a90046fffffffffffffffffffffffffffffffff166040518663ffffffff1660e01b8152600401614ed295949392919061a21e565b602060405180830381865af4158015614eed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f11919061a19c565b9150614fcd565b600280811115614f2b57614f2a61827a565b5b816002811115614f3e57614f3d61827a565b5b03614fcc577326f9d826bded47fc472526ae8095b75ac336963c635515a816600d5f8a81526020019081526020015f206040518263ffffffff1660e01b8152600401614f8a919061a370565b602060405180830381865af4158015614fa5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614fc9919061a19c565b91505b5b5b81955050505050505b919050565b5f600a5f8381526020019081526020015f2060010160149054906101000a900460ff161561500d57600490506150ea565b600a5f8381526020019081526020015f205f01601f9054906101000a900460ff161561503c57600390506150ea565b600a5f8381526020019081526020015f205f0160149054906101000a900464ffffffffff1664ffffffffff16421015615077575f90506150ea565b600a5f8381526020019081526020015f206002015f015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166150c483614bff565b6fffffffffffffffffffffffffffffffff1610156150e557600190506150ea565b600290505b919050565b5f806150fa84615835565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561516457505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801561518f5750600a5f8581526020019081526020015f2060010160169054906101000a900460ff16155b156151d157836040517f93ae96220000000000000000000000000000000000000000000000000000000081526004016151c891906176e4565b60405180910390fd5b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78460405161520091906176e4565b60405180910390a1615213858585616cc2565b9150509392505050565b5f600a5f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f61529082614bff565b90505f600a5f8481526020019081526020015f206002016040518060600160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050805f01516fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff16106153f957826040517ffa36c7170000000000000000000000000000000000000000000000000000000081526004016153f091906176e4565b60405180910390fd5b600a5f8481526020019081526020015f205f01601e9054906101000a900460ff1661545b57826040517f5c7470b700000000000000000000000000000000000000000000000000000000815260040161545291906176e4565b60405180910390fd5b5f82825f01510390505f8260200151846154759190618f1b565b90506001600a5f8781526020019081526020015f205f01601f6101000a81548160ff0219169083151502179055505f600a5f8781526020019081526020015f205f01601e6101000a81548160ff0219169083151502179055505f816fffffffffffffffffffffffffffffffff1603615515576001600a5f8781526020019081526020015f2060010160146101000a81548160ff0219169083151502179055505b81600a5f8781526020019081526020015f206002016001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505f600a5f8781526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f6155a287615835565b90505f600a5f8981526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061561883866fffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16616ecd9092919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508b8989604051615690939291906199be565b60405180910390a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7886040516156c791906176e4565b60405180910390a160095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561582b575f8273ffffffffffffffffffffffffffffffffffffffff16636a5788f88a8689896040518563ffffffff1660e01b815260040161575e949392919061a390565b6020604051808303815f875af115801561577a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061579e9190619a4a565b9050636a5788f860e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461582957826040517f5f3a039d0000000000000000000000000000000000000000000000000000000081526004016158209190617940565b60405180910390fd5b505b5050505050505050565b5f60035f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806158af57506158ae8233613fad565b5b806158ed57503373ffffffffffffffffffffffffffffffffffffffff166158d5846112de565b73ffffffffffffffffffffffffffffffffffffffff16145b905092915050565b5f6159015f835f6150ef565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361597357816040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161596a91906176e4565b60405180910390fd5b5050565b5f80600a5f8481526020019081526020015f206002016040518060600160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050600a5f8481526020019081526020015f2060010160149054906101000a900460ff1615615aa8578060200151915050615af6565b600a5f8481526020019081526020015f205f01601f9054906101000a900460ff1615615ae9578060400151815f0151615ae19190618f1b565b915050615af6565b615af283614bff565b9150505b919050565b600a5f8281526020019081526020015f205f01601e9054906101000a900460ff16615b5d57806040517f5c7470b7000000000000000000000000000000000000000000000000000000008152600401615b5491906176e4565b60405180910390fd5b5f600a5f8381526020019081526020015f205f01601e6101000a81548160ff02191690831515021790555050565b5f80737715be116061e014bb721b46dc78dd57c91fdf9b636df26955855f01518660c001518760400151877f00000000000000000000000000000000000000000000000000000000000000008a6101000151602001518b60e0015167016345785d8a00006040518963ffffffff1660e01b8152600401615c1298979695949392919061a473565b6040805180830381865af4158015615c2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190615c509190619c25565b905060075491505f835190505f5b81811015615d2557600d5f8581526020019081526020015f20858281518110615c8a57615c89618eee565b5b6020026020010151908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a81548164ffffffffff021916908364ffffffffff1602179055505050806001019050615c5e565b505f615d34848785600261654b565b9050837f1cb15a39f12b6a349f8d1d45499b7b9df63464a79fa2e294a7237107e62c384f8287604051615d6892919061a4fe565b60405180910390a250505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603615de957816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401615de09190617940565b60405180910390fd5b8060065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051615ed59190617797565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b111561608e578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02615f256149ca565b8685856040518563ffffffff1660e01b8152600401615f47949392919061a533565b6020604051808303815f875af1925050508015615f8257506040513d601f19601f82011682018060405250810190615f7f9190619a4a565b60015b616003573d805f8114615fb0576040519150601f19603f3d011682016040523d82523d5f602084013e615fb5565b606091505b505f815103615ffb57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401615ff29190617940565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461608c57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016160839190617940565b60405180910390fd5b505b50505050565b5f600a5f8381526020019081526020015f206002015f0160109054906101000a90046fffffffffffffffffffffffffffffffff166160d183615977565b6160db9190618f1b565b9050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603616152575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016161499190617940565b60405180910390fd5b5f61615e83835f6150ef565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036161d057816040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016161c791906176e4565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614616244578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161623b939291906192fb565b60405180910390fd5b50505050565b80600a5f8581526020019081526020015f206002015f0160109054906101000a90046fffffffffffffffffffffffffffffffff16616288919061a57d565b600a5f8581526020019081526020015f206002015f0160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505f600a5f8581526020019081526020015f206002016040518060600160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090508060400151815f01516163e39190618f1b565b6fffffffffffffffffffffffffffffffff1681602001516fffffffffffffffffffffffffffffffff161061646a576001600a5f8681526020019081526020015f2060010160146101000a81548160ff0219169083151502179055505f600a5f8681526020019081526020015f205f01601e6101000a81548160ff0219169083151502179055505b5f600a5f8681526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506164de84846fffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16616ecd9092919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d8660405161653c9190617ac5565b60405180910390a45050505050565b6165536174c4565b604051806101600160405280855f015173ffffffffffffffffffffffffffffffffffffffff1681526020018560c001515f015164ffffffffff1681526020018560c001516020015164ffffffffff1681526020018560800151151581526020015f15158152602001856060015173ffffffffffffffffffffffffffffffffffffffff1681526020015f151581526020016001151581526020018560a001511515815260200183600281111561660b5761660a61827a565b5b81526020016040518060600160405280865f01516fffffffffffffffffffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff16815250815250600a5f8781526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a81548164ffffffffff021916908364ffffffffff1602179055506040820151815f0160196101000a81548164ffffffffff021916908364ffffffffff1602179055506060820151815f01601e6101000a81548160ff0219169083151502179055506080820151815f01601f6101000a81548160ff02191690831515021790555060a0820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160010160146101000a81548160ff02191690831515021790555060e08201518160010160156101000a81548160ff0219169083151502179055506101008201518160010160166101000a81548160ff0219169083151502179055506101208201518160010160176101000a81548160ff0219169083600281111561681d5761681c61827a565b5b0217905550610140820151816002015f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050509050506168f7846020015186616f4c565b600185016007819055506169473330855f01516fffffffffffffffffffffffffffffffff16876060015173ffffffffffffffffffffffffffffffffffffffff1661703f909392919063ffffffff16565b5f83602001516fffffffffffffffffffffffffffffffff1611156169b5576169b4338561010001515f015185602001516fffffffffffffffffffffffffffffffff16876060015173ffffffffffffffffffffffffffffffffffffffff1661703f909392919063ffffffff16565b5b6040518061014001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001855f015173ffffffffffffffffffffffffffffffffffffffff168152602001856020015173ffffffffffffffffffffffffffffffffffffffff168152602001848152602001856060015173ffffffffffffffffffffffffffffffffffffffff1681526020018560800151151581526020018560a00151151581526020018560c0015181526020018560e0015181526020018561010001515f015173ffffffffffffffffffffffffffffffffffffffff168152509050949350505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8080616b3b57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15616c6d575f616b4a8461490b565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015616bb457508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015616bc75750616bc58184613fad565b155b15616c0957826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401616c009190617940565b60405180910390fd5b8115616c6b57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360055f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b5f80616ccd84615835565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614616d0e57616d0d8184866170c1565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614616d9957616d4d5f855f80616b03565b600160045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614616e1857600160045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460035f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b616f47838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401616f00929190619612565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050617184565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603616fbc575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401616fb39190617940565b60405180910390fd5b5f616fc883835f6150ef565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461703a575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016170319190617940565b60405180910390fd5b505050565b6170bb848573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016170749392919061a5c0565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050617184565b50505050565b6170cc838383617219565b61717f575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361714057806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161713791906176e4565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401617176929190619612565b60405180910390fd5b505050565b5f6171ae828473ffffffffffffffffffffffffffffffffffffffff166172d990919063ffffffff16565b90505f8151141580156171d25750808060200190518101906171d09190619393565b155b1561721457826040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161720b9190617940565b60405180910390fd5b505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156172d057508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061729157506172908484613fad565b5b806172cf57508273ffffffffffffffffffffffffffffffffffffffff166172b783614991565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b60606172e683835f6172ee565b905092915050565b60608147101561733557306040517fcd78605900000000000000000000000000000000000000000000000000000000815260040161732c9190617940565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16848660405161735d9190619471565b5f6040518083038185875af1925050503d805f8114617397576040519150601f19603f3d011682016040523d82523d5f602084013e61739c565b606091505b50915091506173ac8683836173b7565b925050509392505050565b6060826173cc576173c782617444565b61743c565b5f82511480156173f257505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561743457836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161742b9190617940565b60405180910390fd5b81905061743d565b5b9392505050565b5f815111156174565780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681525090565b6040518061014001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200161752c61758e565b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f151581526020015f151581526020016175656175ca565b8152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b60405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681525090565b60405180604001604052805f64ffffffffff1681526020015f64ffffffffff1681525090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f610120828403121561761b5761761a617601565b5b81905092915050565b5f6040828403121561763957617638617601565b5b81905092915050565b5f6040828403121561765757617656617601565b5b81905092915050565b5f805f60a08486031215617677576176766175f9565b5b5f84013567ffffffffffffffff811115617694576176936175fd565b5b6176a086828701617605565b93505060206176b186828701617624565b92505060606176c286828701617642565b9150509250925092565b5f819050919050565b6176de816176cc565b82525050565b5f6020820190506176f75f8301846176d5565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b617731816176fd565b811461773b575f80fd5b50565b5f8135905061774c81617728565b92915050565b5f60208284031215617767576177666175f9565b5b5f6177748482850161773e565b91505092915050565b5f8115159050919050565b6177918161777d565b82525050565b5f6020820190506177aa5f830184617788565b92915050565b5f819050919050565b5f6177d36177ce6177c9846176cc565b6177b0565b6176cc565b9050919050565b6177e3816177b9565b82525050565b5f6020820190506177fc5f8301846177da565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561783957808201518184015260208101905061781e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61785e82617802565b617868818561780c565b935061787881856020860161781c565b61788181617844565b840191505092915050565b5f6020820190508181035f8301526178a48184617854565b905092915050565b6178b5816176cc565b81146178bf575f80fd5b50565b5f813590506178d0816178ac565b92915050565b5f602082840312156178eb576178ea6175f9565b5b5f6178f8848285016178c2565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61792a82617901565b9050919050565b61793a81617920565b82525050565b5f6020820190506179535f830184617931565b92915050565b61796281617920565b811461796c575f80fd5b50565b5f8135905061797d81617959565b92915050565b5f8060408385031215617999576179986175f9565b5b5f6179a68582860161796f565b92505060206179b7858286016178c2565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126179e2576179e16179c1565b5b8235905067ffffffffffffffff8111156179ff576179fe6179c5565b5b602083019150836060820283011115617a1b57617a1a6179c9565b5b9250929050565b5f805f60408486031215617a3957617a386175f9565b5b5f84013567ffffffffffffffff811115617a5657617a556175fd565b5b617a6286828701617605565b935050602084013567ffffffffffffffff811115617a8357617a826175fd565b5b617a8f868287016179cd565b92509250509250925092565b5f6fffffffffffffffffffffffffffffffff82169050919050565b617abf81617a9b565b82525050565b5f602082019050617ad85f830184617ab6565b92915050565b5f8083601f840112617af357617af26179c1565b5b8235905067ffffffffffffffff811115617b1057617b0f6179c5565b5b602083019150836020820283011115617b2c57617b2b6179c9565b5b9250929050565b5f8060208385031215617b4957617b486175f9565b5b5f83013567ffffffffffffffff811115617b6657617b656175fd565b5b617b7285828601617ade565b92509250509250929050565b5f6101608284031215617b9457617b93617601565b5b81905092915050565b5f8083601f840112617bb257617bb16179c1565b5b8235905067ffffffffffffffff811115617bcf57617bce6179c5565b5b602083019150836060820283011115617beb57617bea6179c9565b5b9250929050565b5f805f60408486031215617c0957617c086175f9565b5b5f84013567ffffffffffffffff811115617c2657617c256175fd565b5b617c3286828701617b7e565b935050602084013567ffffffffffffffff811115617c5357617c526175fd565b5b617c5f86828701617b9d565b92509250509250925092565b5f805f60608486031215617c8257617c816175f9565b5b5f617c8f8682870161796f565b9350506020617ca08682870161796f565b9250506040617cb1868287016178c2565b9150509250925092565b5f60208284031215617cd057617ccf6175f9565b5b5f617cdd8482850161796f565b91505092915050565b5f617d00617cfb617cf684617901565b6177b0565b617901565b9050919050565b5f617d1182617ce6565b9050919050565b5f617d2282617d07565b9050919050565b617d3281617d18565b82525050565b5f602082019050617d4b5f830184617d29565b92915050565b5f8083601f840112617d6657617d656179c1565b5b8235905067ffffffffffffffff811115617d8357617d826179c5565b5b602083019150836020820283011115617d9f57617d9e6179c9565b5b9250929050565b5f8083601f840112617dbb57617dba6179c1565b5b8235905067ffffffffffffffff811115617dd857617dd76179c5565b5b602083019150836020820283011115617df457617df36179c9565b5b9250929050565b5f805f8060408587031215617e1357617e126175f9565b5b5f85013567ffffffffffffffff811115617e3057617e2f6175fd565b5b617e3c87828801617d51565b9450945050602085013567ffffffffffffffff811115617e5f57617e5e6175fd565b5b617e6b87828801617da6565b925092505092959194509250565b5f8060208385031215617e8f57617e8e6175f9565b5b5f83013567ffffffffffffffff811115617eac57617eab6175fd565b5b617eb885828601617d51565b92509250509250929050565b5f64ffffffffff82169050919050565b617edd81617ec4565b82525050565b5f602082019050617ef65f830184617ed4565b92915050565b617f0581617ec4565b8114617f0f575f80fd5b50565b5f81359050617f2081617efc565b92915050565b5f805f60808486031215617f3d57617f3c6175f9565b5b5f84013567ffffffffffffffff811115617f5a57617f596175fd565b5b617f6686828701617b7e565b9350506020617f7786828701617624565b9250506060617f8886828701617f12565b9150509250925092565b5f617f9c82617920565b9050919050565b617fac81617f92565b8114617fb6575f80fd5b50565b5f81359050617fc781617fa3565b92915050565b5f60208284031215617fe257617fe16175f9565b5b5f617fef84828501617fb9565b91505092915050565b5f8083601f84011261800d5761800c6179c1565b5b8235905067ffffffffffffffff81111561802a576180296179c5565b5b602083019150836040820283011115618046576180456179c9565b5b9250929050565b5f805f60408486031215618064576180636175f9565b5b5f84013567ffffffffffffffff811115618081576180806175fd565b5b61808d86828701617b7e565b935050602084013567ffffffffffffffff8111156180ae576180ad6175fd565b5b6180ba86828701617ff8565b92509250509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6180f881617a9b565b82525050565b61810781617ec4565b82525050565b604082015f8201516181215f8501826180ef565b50602082015161813460208501826180fe565b50505050565b5f618145838361810d565b60408301905092915050565b5f602082019050919050565b5f618167826180c6565b61817181856180d0565b935061817c836180e0565b805f5b838110156181ac578151618193888261813a565b975061819e83618151565b92505060018101905061817f565b5085935050505092915050565b5f6020820190508181035f8301526181d1818461815d565b905092915050565b6181e28161777d565b81146181ec575f80fd5b50565b5f813590506181fd816181d9565b92915050565b5f8060408385031215618219576182186175f9565b5b5f6182268582860161796f565b9250506020618237858286016181ef565b9150509250929050565b5f61824b82617d07565b9050919050565b61825b81618241565b82525050565b5f6020820190506182745f830184618252565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600581106182b8576182b761827a565b5b50565b5f8190506182c8826182a7565b919050565b5f6182d7826182bb565b9050919050565b6182e7816182cd565b82525050565b5f6020820190506183005f8301846182de565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f67ffffffffffffffff82169050919050565b5f61835c6183576183528461832f565b6177b0565b61832f565b9050919050565b61836c81618342565b82525050565b606082015f8201516183865f8501826180ef565b5060208201516183996020850182618363565b5060408201516183ac60408501826180fe565b50505050565b5f6183bd8383618372565b60608301905092915050565b5f602082019050919050565b5f6183df82618306565b6183e98185618310565b93506183f483618320565b805f5b8381101561842457815161840b88826183b2565b9750618416836183c9565b9250506001810190506183f7565b5085935050505092915050565b5f6020820190508181035f83015261844981846183d5565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61848b82617844565b810181811067ffffffffffffffff821117156184aa576184a9618455565b5b80604052505050565b5f6184bc6175f0565b90506184c88282618482565b919050565b5f67ffffffffffffffff8211156184e7576184e6618455565b5b6184f082617844565b9050602081019050919050565b828183375f83830152505050565b5f61851d618518846184cd565b6184b3565b90508281526020810184848401111561853957618538618451565b5b6185448482856184fd565b509392505050565b5f82601f8301126185605761855f6179c1565b5b813561857084826020860161850b565b91505092915050565b5f805f8060808587031215618591576185906175f9565b5b5f61859e8782880161796f565b94505060206185af8782880161796f565b93505060406185c0878288016178c2565b925050606085013567ffffffffffffffff8111156185e1576185e06175fd565b5b6185ed8782880161854c565b91505092959194509250565b5f806040838503121561860f5761860e6175f9565b5b5f61861c858286016178c2565b925050602061862d8582860161796f565b9150509250929050565b5f8083601f84011261864c5761864b6179c1565b5b8235905067ffffffffffffffff811115618669576186686179c5565b5b602083019150836040820283011115618685576186846179c9565b5b9250929050565b5f805f604084860312156186a3576186a26175f9565b5b5f84013567ffffffffffffffff8111156186c0576186bf6175fd565b5b6186cc86828701617605565b935050602084013567ffffffffffffffff8111156186ed576186ec6175fd565b5b6186f986828701618637565b92509250509250925092565b604082015f8201516187195f8501826180ef565b50602082015161872c60208501826180ef565b50505050565b5f6040820190506187455f830184618705565b92915050565b6003811061875c5761875b61827a565b5b50565b5f81905061876c8261874b565b919050565b5f61877b8261875f565b9050919050565b61878b81618771565b82525050565b5f6020820190506187a45f830184618782565b92915050565b5f80604083850312156187c0576187bf6175f9565b5b5f6187cd8582860161796f565b92505060206187de8582860161796f565b9150509250929050565b6187f181617a9b565b81146187fb575f80fd5b50565b5f8135905061880c816187e8565b92915050565b5f805f60608486031215618829576188286175f9565b5b5f618836868287016178c2565b93505060206188478682870161796f565b9250506040618858868287016187fe565b9150509250925092565b5f60208284031215618877576188766175f9565b5b5f61888484828501617f12565b91505092915050565b5f602082840312156188a2576188a16175f9565b5b5f6188af848285016187fe565b91505092915050565b5f6188c282617920565b9050919050565b6188d2816188b8565b81146188dc575f80fd5b50565b5f813590506188ed816188c9565b92915050565b5f60208284031215618908576189076175f9565b5b5f618915848285016188df565b91505092915050565b5f60208284031215618933576189326175f9565b5b5f618940848285016181ef565b91505092915050565b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261897157618970618949565b5b80840192508235915067ffffffffffffffff8211156189935761899261894d565b5b6020830192506001820236038313156189af576189ae618951565b5b509250929050565b5f80fd5b5f80fd5b6189c8816176cc565b81146189d2575f80fd5b50565b5f813590506189e3816189bf565b92915050565b5f604082840312156189fe576189fd6189b7565b5b618a0860406184b3565b90505f618a178482850161796f565b5f830152506020618a2a848285016189d5565b60208301525092915050565b5f60408284031215618a4b57618a4a6175f9565b5b5f618a58848285016189e9565b91505092915050565b5f60408284031215618a7657618a756189b7565b5b618a8060406184b3565b90505f618a8f848285016187fe565b5f830152506020618aa2848285016187fe565b60208301525092915050565b5f60408284031215618ac357618ac26175f9565b5b5f618ad084828501618a61565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680618b1d57607f821691505b602082108103618b3057618b2f618ad9565b5b50919050565b5f82825260208201905092915050565b5f819050919050565b5f618b5d60208401846187fe565b905092915050565b618b6e81617a9b565b82525050565b618b7d8161832f565b8114618b87575f80fd5b50565b5f81359050618b9881618b74565b92915050565b5f618bac6020840184618b8a565b905092915050565b618bbd81618342565b82525050565b5f618bd16020840184617f12565b905092915050565b618be281617ec4565b82525050565b60608201618bf85f830183618b4f565b618c045f850182618b65565b50618c126020830183618b9e565b618c1f6020850182618bb4565b50618c2d6040830183618bc3565b618c3a6040850182618bd9565b50505050565b5f618c4b8383618be8565b60608301905092915050565b5f82905092915050565b5f606082019050919050565b5f618c788385618b36565b9350618c8382618b46565b805f5b85811015618cbb57618c988284618c57565b618ca28882618c40565b9750618cad83618c61565b925050600181019050618c86565b5085925050509392505050565b5f6020820190508181035f830152618ce1818486618c6d565b90509392505050565b5f67ffffffffffffffff821115618d0457618d03618455565b5b602082029050602081019050919050565b5f81519050618d23816187e8565b92915050565b5f81519050618d3781618b74565b92915050565b5f81519050618d4b81617efc565b92915050565b5f60608284031215618d6657618d656189b7565b5b618d7060606184b3565b90505f618d7f84828501618d15565b5f830152506020618d9284828501618d29565b6020830152506040618da684828501618d3d565b60408301525092915050565b5f618dc4618dbf84618cea565b6184b3565b90508083825260208201905060608402830185811115618de757618de66179c9565b5b835b81811015618e105780618dfc8882618d51565b845260208401935050606081019050618de9565b5050509392505050565b5f82601f830112618e2e57618e2d6179c1565b5b8151618e3e848260208601618db2565b91505092915050565b5f60208284031215618e5c57618e5b6175f9565b5b5f82015167ffffffffffffffff811115618e7957618e786175fd565b5b618e8584828501618e1a565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f618ec5826176cc565b9150618ed0836176cc565b9250828203905081811115618ee857618ee7618e8e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f618f2582617a9b565b9150618f3083617a9b565b925082820390506fffffffffffffffffffffffffffffffff811115618f5857618f57618e8e565b5b92915050565b5f8083356001602003843603038112618f7a57618f79618949565b5b80840192508235915067ffffffffffffffff821115618f9c57618f9b61894d565b5b602083019250600182023603831315618fb857618fb7618951565b5b509250929050565b5f81905092915050565b5f618fd58385618fc0565b9350618fe28385846184fd565b82840190509392505050565b5f618ffa828486618fca565b91508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f61902a82619006565b6190348185619010565b935061904481856020860161781c565b61904d81617844565b840191505092915050565b5f6020820190508181035f8301526190708184619020565b905092915050565b5f6040828403121561908d5761908c6189b7565b5b61909760406184b3565b90505f6190a684828501617f12565b5f8301525060206190b984828501617f12565b60208301525092915050565b5f67ffffffffffffffff8211156190df576190de618455565b5b6190e882617844565b9050602081019050919050565b5f619107619102846190c5565b6184b3565b90508281526020810184848401111561912357619122618451565b5b61912e8482856184fd565b509392505050565b5f82601f83011261914a576191496179c1565b5b813561915a8482602086016190f5565b91505092915050565b5f6101608284031215619179576191786189b7565b5b6191846101206184b3565b90505f6191938482850161796f565b5f8301525060206191a68482850161796f565b60208301525060406191ba848285016187fe565b60408301525060606191ce848285016188df565b60608301525060806191e2848285016181ef565b60808301525060a06191f6848285016181ef565b60a08301525060c061920a84828501619078565b60c08301525061010082013567ffffffffffffffff81111561922f5761922e6189bb565b5b61923b84828501619136565b60e083015250610120619250848285016189e9565b6101008301525092915050565b5f6192683683619163565b9050919050565b5f60608284031215619284576192836189b7565b5b61928e60606184b3565b90505f61929d848285016187fe565b5f8301525060206192b084828501618b8a565b60208301525060406192c484828501617f12565b60408301525092915050565b5f606082840312156192e5576192e46175f9565b5b5f6192f28482850161926f565b91505092915050565b5f60608201905061930e5f830186617931565b61931b60208301856176d5565b6193286040830184617931565b949350505050565b5f6040820190506193435f830185617931565b6193506020830184617931565b9392505050565b619360816176fd565b82525050565b5f6020820190506193795f830184619357565b92915050565b5f8151905061938d816181d9565b92915050565b5f602082840312156193a8576193a76175f9565b5b5f6193b58482850161937f565b91505092915050565b5f6040820190506193d15f8301856176d5565b6193de6020830184617931565b9392505050565b5f6040820190506193f85f8301856176d5565b61940560208301846176d5565b9392505050565b5f60608201905061941f5f8301866176d5565b61942c6020830185617931565b6194396040830184617ab6565b949350505050565b5f61944b82619006565b6194558185618fc0565b935061946581856020860161781c565b80840191505092915050565b5f61947c8284619441565b915081905092915050565b5f60408201905061949a5f8301856176d5565b81810360208301526194ac8184619020565b90509392505050565b5f6040820190506194c85f830185618782565b6194d56020830184618782565b9392505050565b5f6040820190506194ef5f830185617d29565b6194fc6020830184617d29565b9392505050565b5f819050919050565b5f61952661952161951c84619503565b6177b0565b6176cc565b9050919050565b6195368161950c565b82525050565b5f60408201905061954f5f83018561952d565b61955c60208301846176d5565b9392505050565b5f60408284031215619578576195776189b7565b5b61958260406184b3565b90505f619591848285016187fe565b5f8301525060206195a484828501617f12565b60208301525092915050565b5f604082840312156195c5576195c46175f9565b5b5f6195d284828501619563565b91505092915050565b50565b5f6195e95f83618fc0565b91506195f4826195db565b5f82019050919050565b5f619608826195de565b9150819050919050565b5f6040820190506196255f830185617931565b61963260208301846176d5565b9392505050565b5f61964382617d07565b9050919050565b61965381619639565b82525050565b5f60408201905061966c5f83018561964a565b61967960208301846176d5565b9392505050565b5f61969261968d846190c5565b6184b3565b9050828152602081018484840111156196ae576196ad618451565b5b6196b984828561781c565b509392505050565b5f82601f8301126196d5576196d46179c1565b5b81516196e5848260208601619680565b91505092915050565b5f60208284031215619703576197026175f9565b5b5f82015167ffffffffffffffff8111156197205761971f6175fd565b5b61972c848285016196c1565b91505092915050565b5f82825260208201905092915050565b5f819050919050565b6040820161975e5f830183618b4f565b61976a5f850182618b65565b506197786020830183618bc3565b6197856020850182618bd9565b50505050565b5f619796838361974e565b60408301905092915050565b5f82905092915050565b5f604082019050919050565b5f6197c38385619735565b93506197ce82619745565b805f5b85811015619806576197e382846197a2565b6197ed888261978b565b97506197f8836197ac565b9250506001810190506197d1565b5085925050509392505050565b5f6020820190508181035f83015261982c8184866197b8565b90509392505050565b5f67ffffffffffffffff82111561984f5761984e618455565b5b602082029050602081019050919050565b5f60408284031215619875576198746189b7565b5b61987f60406184b3565b90505f61988e84828501618d15565b5f8301525060206198a184828501618d3d565b60208301525092915050565b5f6198bf6198ba84619835565b6184b3565b905080838252602082019050604084028301858111156198e2576198e16179c9565b5b835b8181101561990b57806198f78882619860565b8452602084019350506040810190506198e4565b5050509392505050565b5f82601f830112619929576199286179c1565b5b81516199398482602086016198ad565b91505092915050565b5f60208284031215619957576199566175f9565b5b5f82015167ffffffffffffffff811115619974576199736175fd565b5b61998084828501619915565b91505092915050565b5f60608201905061999c5f8301866176d5565b6199a96020830185617931565b6199b66040830184617931565b949350505050565b5f6060820190506199d15f8301866176d5565b6199de6020830185617ab6565b6199eb6040830184617ab6565b949350505050565b5f608082019050619a065f8301876176d5565b619a136020830186617931565b619a206040830185617931565b619a2d6060830184617ab6565b95945050505050565b5f81519050619a4481617728565b92915050565b5f60208284031215619a5f57619a5e6175f9565b5b5f619a6c84828501619a36565b91505092915050565b619a7e81617920565b82525050565b604082015f820151619a985f850182618bd9565b506020820151619aab6020850182618bd9565b50505050565b619aba81617ec4565b82525050565b619ac981617a9b565b82525050565b604082015f820151619ae35f850182618b65565b506020820151619af66020850182618b65565b50505050565b619b05816177b9565b82525050565b5f82825260208201905092915050565b5f619b2582617802565b619b2f8185619b0b565b9350619b3f81856020860161781c565b619b4881617844565b840191505092915050565b5f61014082019050619b675f83018b619a75565b619b74602083018a619a84565b619b816060830189619ab1565b619b8e6080830188619ac0565b619b9b60a0830187619acf565b619ba860e0830186619afc565b818103610100830152619bbb8185619b1b565b9050619bcb610120830184619afc565b9998505050505050505050565b5f60408284031215619bed57619bec6189b7565b5b619bf760406184b3565b90505f619c0684828501618d15565b5f830152506020619c1984828501618d15565b60208301525092915050565b5f60408284031215619c3a57619c396175f9565b5b5f619c4784828501619bd8565b91505092915050565b619c5981617920565b82525050565b604082015f820151619c735f8501826180ef565b506020820151619c8660208501826180ef565b50505050565b619c9581618241565b82525050565b619ca48161777d565b82525050565b604082015f820151619cbe5f8501826180fe565b506020820151619cd160208501826180fe565b50505050565b5f82825260208201905092915050565b5f619cf182617802565b619cfb8185619cd7565b9350619d0b81856020860161781c565b619d1481617844565b840191505092915050565b5f61018083015f830151619d355f860182619c50565b506020830151619d486020860182619c50565b506040830151619d5b6040860182619c50565b506060830151619d6e6060860182619c5f565b506080830151619d8160a0860182619c8c565b5060a0830151619d9460c0860182619c9b565b5060c0830151619da760e0860182619c9b565b5060e0830151619dbb610100860182619caa565b50610100830151848203610140860152619dd58282619ce7565b915050610120830151619dec610160860182619c50565b508091505092915050565b5f6080820190508181035f830152619e0f8186619d1f565b9050619e1e6020830185617ed4565b619e2b6040830184618705565b949350505050565b5f82825260208201905092915050565b606082015f820151619e575f850182618b65565b506020820151619e6a6020850182618bb4565b506040820151619e7d6040850182618bd9565b50505050565b5f619e8e8383619e43565b60608301905092915050565b5f619ea482618306565b619eae8185619e33565b9350619eb983618320565b805f5b83811015619ee9578151619ed08882619e83565b9750619edb836183c9565b925050600181019050619ebc565b5085935050505092915050565b619eff816176cc565b82525050565b5f61012082019050619f195f83018b619a75565b619f26602083018a619a84565b619f336060830189619ac0565b8181036080830152619f458188619e9a565b9050619f5460a0830187619ef6565b619f6160c0830186619afc565b81810360e0830152619f738185619b1b565b9050619f83610100830184619afc565b9998505050505050505050565b5f6040820190508181035f830152619fa88185619d1f565b90508181036020830152619fbc81846183d5565b90509392505050565b5f81549050919050565b5f819050815f5260205f209050919050565b5f815f1c9050919050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b5f61a01961a01483619fe1565b619fec565b9050919050565b5f8160801c9050919050565b5f67ffffffffffffffff82169050919050565b5f61a05161a04c8361a020565b61a02c565b9050919050565b5f8160c01c9050919050565b5f64ffffffffff82169050919050565b5f61a08661a0818361a058565b61a064565b9050919050565b606082015f80830154905061a0a18161a007565b61a0ad5f860182618b65565b5061a0b78161a03f565b61a0c46020860182618bb4565b5061a0ce8161a074565b61a0db6040860182618bd9565b5050505050565b5f61a0ed838361a08d565b60608301905092915050565b5f600182019050919050565b5f61a10f82619fc5565b61a1198185619e33565b935061a12483619fcf565b805f5b8381101561a153578161a13a888261a0e2565b975061a1458361a0f9565b92505060018101905061a127565b5085935050505092915050565b5f6060820190508181035f83015261a178818661a105565b905061a1876020830185619ab1565b61a1946040830184619ac0565b949350505050565b5f6020828403121561a1b15761a1b06175f9565b5b5f61a1be84828501618d15565b91505092915050565b5f61a1d961a1d48361a020565b619fec565b9050919050565b604082015f80830154905061a1f48161a007565b61a2005f860182618b65565b5061a20a8161a1c7565b61a2176020860182618b65565b5050505050565b5f60e08201905061a2315f830188619ac0565b61a23e6020830187619a84565b61a24b6060830186619ab1565b61a258608083018561a1e0565b61a26560c0830184619ac0565b9695505050505050565b5f81549050919050565b5f82825260208201905092915050565b5f819050815f5260205f209050919050565b5f61a2ad61a2a88361a020565b61a064565b9050919050565b604082015f80830154905061a2c88161a007565b61a2d45f860182618b65565b5061a2de8161a29b565b61a2eb6020860182618bd9565b5050505050565b5f61a2fd838361a2b4565b60408301905092915050565b5f600182019050919050565b5f61a31f8261a26f565b61a329818561a279565b935061a3348361a289565b805f5b8381101561a363578161a34a888261a2f2565b975061a3558361a309565b92505060018101905061a337565b5085935050505092915050565b5f6020820190508181035f83015261a388818461a315565b905092915050565b5f60808201905061a3a35f8301876176d5565b61a3b06020830186617931565b61a3bd6040830185617ab6565b61a3ca6060830184617ab6565b95945050505050565b604082015f82015161a3e75f850182618b65565b50602082015161a3fa6020850182618bd9565b50505050565b5f61a40b838361a3d3565b60408301905092915050565b5f61a421826180c6565b61a42b818561a279565b935061a436836180e0565b805f5b8381101561a46657815161a44d888261a400565b975061a45883618151565b92505060018101905061a439565b5085935050505092915050565b5f6101208201905061a4875f83018b619a75565b61a494602083018a619a84565b61a4a16060830189619ac0565b818103608083015261a4b3818861a417565b905061a4c260a0830187619ef6565b61a4cf60c0830186619afc565b81810360e083015261a4e18185619b1b565b905061a4f1610100830184619afc565b9998505050505050505050565b5f6040820190508181035f83015261a5168185619d1f565b9050818103602083015261a52a818461815d565b90509392505050565b5f60808201905061a5465f830187617931565b61a5536020830186617931565b61a56060408301856176d5565b818103606083015261a5728184619020565b905095945050505050565b5f61a58782617a9b565b915061a59283617a9b565b925082820190506fffffffffffffffffffffffffffffffff81111561a5ba5761a5b9618e8e565b5b92915050565b5f60608201905061a5d35f830186617931565b61a5e06020830185617931565b61a5ed60408301846176d5565b94935050505056fea164736f6c634300081a000a"; bytes public constant BYTECODE_NFT_DESCRIPTOR = - hex"6080806040523460155761600c908161001a8239f35b5f80fdfe6102406040526004361015610012575f80fd5b5f3560e01c63e9dc637514610025575f80fd5b346141bc5760403660031901126141bc576001600160a01b036004351680600435036141bc576103e06040525f61024081905260606102608190526102808290526102a08290526102c0819052610300819052610320819052610340819052610360819052610380526103a08190526103c0526102e08190526100b6906100ad600435614824565b61030052614b9d565b610320526102e0516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa9081156145b8575f91614681575b506001600160a01b0361012791168061024052614c99565b610260526102e0516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156145b8576fffffffffffffffffffffffffffffffff915f91614662575b5016610280526102e0516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156145b8575f90614625575b6101f59150614e3b565b610360526102e0516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa9081156145b8575f916145f6575b50610280516fffffffffffffffffffffffffffffffff1680156145e2576fffffffffffffffffffffffffffffffff612710819302160416610160610240015260405160208101904682526bffffffffffffffffffffffff1960043560601b1660408201526024356054820152605481526102c9607482614710565b51902061040a60028061016861ffff8560101c160693600161031c63ffffffff601e61031482601461030c82604660ff6050818d60081c16069b16069d16615568565b970116615568565b980116615568565b60246040519788947f68736c2800000000000000000000000000000000000000000000000000000000602087015261035d815180926020868a0191016146ca565b85017f2c00000000000000000000000000000000000000000000000000000000000000838201526103988251809360206025850191016146ca565b01017f252c000000000000000000000000000000000000000000000000000000000000838201526103d38251809360206003850191016146ca565b01017f2529000000000000000000000000000000000000000000000000000000000000838201520301601d19810184520182614710565b6104446fffffffffffffffffffffffffffffffff604061024001511660ff61043d6001600160a01b036102405116614f3b565b16906150a1565b9061045a6001600160a01b036102405116614b9d565b906020610240015190602460206001600160a01b0360a0610240015116604051928380927fbc2be1be000000000000000000000000000000000000000000000000000000008252823560048301525afa80156145b8576024915f916145c3575b5060206001600160a01b0360a0610240015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa80156145b85764ffffffffff8091610522945f91614589575b50169116615397565b610320516103a051939091906105ac600161054a6064610543818a06615a13565b9804615568565b602060405198826105648b945180928580880191016146ca565b8301610578825180938580850191016146ca565b01017f2500000000000000000000000000000000000000000000000000000000000000815203601e19810188520186614710565b61016061024001519561012061024001519760c061024001519560405161016052610140610160510161016051811067ffffffffffffffff821117614575576040526101605152602061016051015260406101605101526060610160510152608061016051015260a061016051015260c061016051015260e06101605101526101006101605101526101206101605101526040516101c0810181811067ffffffffffffffff82111761457557604052606081525f60208201525f60408201526060808201525f6080820152606060a08201525f60c08201525f60e082015260606101008201525f6101208201525f61014082015260606101608201525f6101808201525f6101a082015260e06101605101516108ec6109cb60046007602760586106e3610100610160510151610160515190615b14565b60b76106ee5f615e04565b985f6102205260206102205261071660405161070d6102205182614710565b5f815284615832565b1561456b57601b60909a5b61072a8c615568565b906040519b8c9889937f3c672069643d220000000000000000000000000000000000000000000000000061022051860152835161077081846102205188019801886146ca565b8b017f222066696c6c3d2223666666223e000000000000000000000000000000000000838201527f3c726563742077696474683d220000000000000000000000000000000000000060358201526107d382518093604284019061022051016146ca565b0101917f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033858401527f222072783d223135222072793d22313522207374726f6b653d22236666662220603b8401527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647468605b8401527f3d2234222f3e0000000000000000000000000000000000000000000000000000607b8401527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60818401527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060a18401527f666f6e742d73697a653d2232327078223e00000000000000000000000000000060c184015251809360d28401906146ca565b0101661e17ba32bc3a1f60c91b838201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d60be8201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060de8201527f666f6e742d73697a653d2232367078223e00000000000000000000000000000060fe8201526109868251809361010f84019061022051016146ca565b0101661e17ba32bc3a1f60c91b838201526109ad82518093605f84019061022051016146ca565b0101631e17b39f60e11b838201520301601b19810184520182614710565b6101008301526101208201526101206101605101516108ec610a3960046007602760586040516109fe6102205182614710565b5f815260b7610a0d6001615e04565b98601b6028610a1b8c615f0f565b610a2484615f87565b8082111561456457505b019a61072a8c615568565b61016083015261018082015260206101605101516108ec610a7a6004600760276058604051610a6b6102205182614710565b5f815260b7610a0d6002615e04565b8252602082015260286080610160510151604051610a9b6102205182614710565b5f81526108ec610ae56004600760276058610ab66003615e04565b9660b7610ac289615f0f565b610acb8b615f87565b8082111561455c5750995b601b8c8c019a61072a8c615568565b60a085015260c0840152602083015101016101208201510161018082015101603081016080830152602f19906103e8030160011c8061014083015261012082015101601081016101a083015261018082015101610220518101604083015260106102205191602084015101010160e0820152610b7461010082015161016083015183519060a085015192615034565b60608201526101006101208190526040516101a0819052610b959190614710565b60c76101a051527f3c726563742077696474683d223130302522206865696768743d223130302522610220516101a05101527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260406101a05101527f37302220793d223730222077696474683d2238363022206865696768743d223860606101a05101527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060806101a05101527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a06101a05101527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c06101a05101527f683d2234222f3e0000000000000000000000000000000000000000000000000060e06101a05101526101605151610120610160510151906060830151610140525f610200526060610200526040516101e052610cf7610200516101e051614710565b60336101e051527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d22610220516101e05101527f75726c282352616469616c476c6f7729222f3e0000000000000000000000000060406101e051015261014060405190610d638183614710565b61011c82527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d2230610220518301527f2220793d2230222077696474683d223130302522206865696768743d2231303060408301527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c31312529610200518301527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808301527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08301527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08301527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08301527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c2220610120518301527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e000000006101208301525f6101c0526103a06101c0526119426118bd6073606b60405196610eec6101c05189614710565b61037b88527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c610220518901527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408901527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c610200518901527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808901527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08901527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08901527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08901527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e610120518901527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208901527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c36868901527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608901527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808901527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08901527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08901527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08901527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008901527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208901527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408901527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608901527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808901527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08901527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08901527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08901527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008901527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208901527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408901527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608901527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808901525f6101805260a06101805260405160a0526113516101805160a051614710565b607560a051527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f6102205160a05101527f6e652220643d224d313235203435683735307338302030203830203830763735604060a05101527f307330203830202d3830203830682d373530732d38302030202d3830202d38306102005160a05101527f762d3735307330202d3830203830202d3830222f3e0000000000000000000000608060a051015261193d6014602261140a615ad9565b9360a2604051957f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e610220518801527f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d220000604088015261153f6025603589605e87519561022051890196611480818486018a6146ca565b83017f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000838201528f7f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22908201526114e382518093609384019061022051016146ca565b01017f222073746f702d6f7061636974793d2230222f3e000000000000000000000000838201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060498201520301600581018a520188614710565b61165685602361154d615ad9565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d610220518401527f223025222079313d223025223e0000000000000000000000000000000000000060408401527f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d220000604d84015288516115d6818486018a6146ca565b83016211179f60e91b838201527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22606e82015261161f82518093608e84019061022051016146ca565b01016211179f60e91b83820152701e17b634b732b0b923b930b234b2b73a1f60791b60268201520301600b1981018b520189614710565b6117e060726023611665615ad9565b6040519c8d917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d2220610220518401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d220060548401526116f4815180928486019061022051016146ca565b82016211179f60e91b828201527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22607682015288519061173882609683018a6146ca565b01016211179f60e91b838201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60268201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160468201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e00006066820152701e17b634b732b0b923b930b234b2b73a1f60791b60848201520301605281018c52018a614710565b6117e8615ad9565b906040519a8b947f3c6c696e6561724772616469656e742069643d22486f7572676c617373537472610220518701527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408701527f302922206772616469656e74556e6974733d227573657253706163654f6e5573610200518701527f65223e000000000000000000000000000000000000000000000000000000000060808701527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d22006083870152518092858701906146ca565b83016211179f60e91b838201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a58201526119068251809360c484019061022051016146ca565b01016211179f60e91b83820152701e17b634b732b0b923b930b234b2b73a1f60791b60258201520301600b19810187520185614710565b615034565b60e052611956611950614dc5565b85615832565b938415614541575b5060c061010081905260405191906119769083614710565b609082527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c610220518301527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408301527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e3032222073610200518301527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808301527f726f6b652d77696474683d2234222f3e00000000000000000000000000000000610180518301526102c060405160c052611a538160c051614710565b61029860c051527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d6102205160c05101527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e31604060c05101527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d316102005160c05101527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d313532608060c05101527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e34316101805160c05101527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c6101005160c05101527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e060c05101527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101205160c05101527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c313961012060c05101527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c8260c05101527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e61016060c05101527f3630322c32312e303739733131312e3833312d372e3438372c3135322e35383761018060c05101527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a060c05101527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c060c05101527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e060c05101527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e3261020060c05101527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e373961022060c05101527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e303161024060c05101527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d61026060c05101527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a61028060c05101527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a060c0510152855f1461432c57604051611dce6102205182614710565b5f8152955b156141d957604051611de76101e082614710565b6101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d32610220518201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d3533610200518201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a610180518201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c70617468610100518201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e610120518201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e838201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152905b604051926120206107e085614710565b6107a7845261022080517f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f7572908601527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408087019190915261020080517f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f908801527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c31608088015261018080517f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373690890152610100517f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e3139908901527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e089015261012080517f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e3335908a01527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e393533908901527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e36948801949094527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608801527f2c39362e3535342d37312e3932312c3231352e3635322d37312e393231733231938701939093527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08701527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c0808801919091527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08801527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c938701939093527f696e652078313d223133342e3336222079313d223136312e323033222078323d828701527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408701527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608701527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808701527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08701527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d22938601939093527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08601527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008601527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208601527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408601527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608601527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c313061038086015290517f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c3132908501527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08501527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08501527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008501527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208501527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408501527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608501527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808501527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08501527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08501527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08501527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008501527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208501527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408501527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608501527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808501527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08501527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08501527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08501527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008501527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208501527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408501527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608501527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808501527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08501527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08501527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08501527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008501527f2e383232203438312e393031203438312e373938203438312e383737203438316107208501527f2e373735203438312e383534203335302e303135203335302e303236203231386107408501527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608501527f223231382e313835203438312e393031203231382e323331203438312e3835346107808501527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08501527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0850152905181517f3c672069643d22486f7572676c617373223e00000000000000000000000000009082015284519151909788959092916129ef9183916032890191016146ca565b840160c051519060328101826102205160c0510191612a0d926146ca565b016032018082518093610220510191612a25926146ca565b018082518093610220510191612a3a926146ca565b018082518093610220510191612a4f926146ca565b01631e17b39f60e11b815203601b1981018452600401612a6f9084614710565b60405160805261022051608051017f3c646566733e000000000000000000000000000000000000000000000000000090526101e0515160805160260181610220516101e0510191612abf926146ca565b60805101815191826026830191610220510191612adb926146ca565b016026018082518093610220510191612af3926146ca565b0160a051519080826102205160a0510191612b0d926146ca565b0160e051519080826102205160e0510191612b27926146ca565b018082518093610220510191612b3c926146ca565b01610140515190808261022051610140510191612b58926146ca565b017f3c2f646566733e000000000000000000000000000000000000000000000000008152608051900360181981016080515260070160805190612b9a91614710565b6101605160a00151906101605160c00151916101605160400151906101605160600151612bc78583615d58565b916040958651612bd78882614710565b600581526102205181017f2d31303025000000000000000000000000000000000000000000000000000000905287519485916102205183017f3c74657874506174682073746172744f66667365743d220000000000000000009052805190816037850191610220510191612c4a926146ca565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366666037918401918201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201528151610220519092612d8e918491610120850191016146ca565b0160370160e981016a1e17ba32bc3a2830ba341f60a91b90520360e90160141981018552600b01612dbf9085614710565b612dc891615d58565b928551612dd58782614710565b60028152610220518101947f3025000000000000000000000000000000000000000000000000000000000000865287519586926102205184017f3c74657874506174682073746172744f66667365743d22000000000000000000905251908160378501612e41926146ca565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366666037918401918201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201528151610220519092612f85918491610120850191016146ca565b0160370160e981016a1e17ba32bc3a2830ba341f60a91b90520360e90160141981018552600b01612fb69085614710565b612fc08282615dbf565b918651612fcd8882614710565b60048152610220518101937f2d35302500000000000000000000000000000000000000000000000000000000855288519485926102205184017f3c74657874506174682073746172744f66667365743d22000000000000000000905251908160378501613039926146ca565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366666037918401918201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e000000000000000000610109820152815161022051909261317d918491610120850191016146ca565b0160370160e981016a1e17ba32bc3a2830ba341f60a91b90520360e90160141981018452600b016131ae9084614710565b6131b791615dbf565b9085516131c48782614710565b60038152610220518101927f3530250000000000000000000000000000000000000000000000000000000000845287519384926102205184017f3c74657874506174682073746172744f66667365743d22000000000000000000905251908160378501613230926146ca565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366666037918401918201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201528151610220519092613374918491610120850191016146ca565b0160370160e981016a1e17ba32bc3a2830ba341f60a91b90520360e90160141981018352600b016133a59083614710565b85519384936102205185017f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537090528785017f656564223e0000000000000000000000000000000000000000000000000000009052805190816045870191610220510191613411926146ca565b840181519182604583019161022051019161342b926146ca565b016045018082518093610220510191613443926146ca565b018082518093610220510191613458926146ca565b01661e17ba32bc3a1f60c91b8152036018198101825260070161347b9082614710565b610140820151916101a08101519060408101519060e001519361349d90615568565b916134a790615568565b906134b190615568565b936134bb90615568565b8551948592610220518401947f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2286528885017f2e39222f3e0000000000000000000000000000000000000000000000000000009052604585017f3c75736520687265663d2223476c6f772220783d22313030302220793d2231309052606585017f3030222066696c6c2d6f7061636974793d222e39222f3e0000000000000000009052607c85017f3c75736520687265663d22234c6f676f2220783d223137302220793d223137309052609c85017f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872905260bc85017f65663d2223486f7572676c6173732220783d223135302220793d223930222074905260dc85017f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d905260fc85017f6f726967696e3d2235303020353030222f3e0000000000000000000000000000905261010e85017f3c75736520687265663d222350726f67726573732220783d2200000000000000905280519081610127870191610220510191613662926146ca565b840161012781016a11103c9e911b9c9811179f60a91b905261013281017f3c75736520687265663d22235374617475732220783d220000000000000000009052815191826101498301916102205101916136bb926146ca565b0161012701602281016a11103c9e911b9c9811179f60a91b9052602d81017f3c75736520687265663d2223416d6f756e742220783d220000000000000000009052815191826044830191610220510191613714926146ca565b01602201602281016a11103c9e911b9c9811179f60a91b9052602d81017f3c75736520687265663d22234475726174696f6e2220783d2200000000000000905281519182604683019161022051019161376c926146ca565b01602201602481016a11103c9e911b9c9811179f60a91b90520360240160141981018452600b0161379d9084614710565b83519283926102205184017f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323090528584017f30302f737667222077696474683d223130303022206865696768743d2231303090526102005184017f30222076696577426f783d2230203020313030302031303030223e000000000090526101a05151607b850181610220516101a0510191613837926146ca565b84016080515190607b810182610220516080510191613855926146ca565b01607b01808251809361022051019161386d926146ca565b0191829151809361387d926146ca565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000815203601919810182526006016138b69082614710565b610380526102e0518151610220517fb25645690000000000000000000000000000000000000000000000000000000090820190815260248035818401528252916001600160a01b03169061390b604482614710565b515a925f93928493fa61391c614793565b610340819052901580156103c0526141d15761022051818051810103126141bc5761022051015180151581036141bc575b15156102a052610260516102e05182517fb971302a00000000000000000000000000000000000000000000000000000000815260248035600483015261022051919283919082906001600160a01b03165afa9081156141c7575f9161417b575b50600360236139be613ad693614b9d565b938161012061024001518780519788947f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a2261022051870152613a0b815180928589019061022051016146ca565b85017f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c75658382015262111d1160e91b61020051820152613a5682518093606384019061022051016146ca565b01017f227d2c7b2274726169745f74797065223a22537461747573222c2276616c75658382015262111d1160e91b6043820152613a9f82518093604684019061022051016146ca565b01017f227d5d0000000000000000000000000000000000000000000000000000000000838201520301601c19810184520182614710565b6103005161026051610320516102405191939291613afc906001600160a01b0316614b9d565b613b07602435615568565b6102a051909190156140ef5761010051875190613b249082614710565b609b81527fe29aa0efb88f205741524e494e473a205472616e7366657272696e6720746865610220518201527f204e4654206d616b657320746865206e6577206f776e65722074686520726563888201527f697069656e74206f66207468652073747265616d2e205468652066756e647320610200518201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e2060808201527f666f72207468652070726576696f757320726563697069656e742e000000000061018051820152915b8751968794610220518601967f54686973204e465420726570726573656e74732061207061796d656e7420737488528a87017f7265616d20696e2061205361626c696572204c6f636b757020000000000000009052805190610220518101918060598a0190613c5c91856146ca565b7f20636f6e74726163742e20546865206f776e6572206f662074686973204e46546059918a01918201527f2063616e207769746864726177207468652073747265616d656420617373657460798201527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609982015284516102205186019691613cea8260b583018a6146ca565b01605901605c81017f2e5c6e5c6e2d2053747265616d2049443a200000000000000000000000000000905281519182606e830191610220510191613d2d926146ca565b01605c0190601282016302e3716960e51b905251918260168301613d50926146ca565b01601201600481016901020b2323932b9b99d160b51b905281519182600e830191610220510191613d80926146ca565b0160040190600a82016302e3716960e51b9052519182600e8301613da3926146ca565b01600a01600481016901020b2323932b9b99d160b51b905281519182600e830191610220510191613dd3926146ca565b01600401600a81017f5c6e5c6e00000000000000000000000000000000000000000000000000000000905281519182600e830191610220510191613e16926146ca565b01600a0103600401601f1981018452613e2f9084614710565b61030051613e3e602435615568565b855180916102205182019367029b0b13634b2b9160c51b8552805190816028850191610220510191613e6f926146ca565b8201602881017f2023000000000000000000000000000000000000000000000000000000000000905281519182602a830191610220510191613eb0926146ca565b0160280103600201601f1981018252613ec99082614710565b61038051613ed6906156c7565b9286519586956102205187017f7b2261747472696275746573223a000000000000000000000000000000000000905280519081602e890191610220510191613f1d926146ca565b860190602e82017f2c226465736372697074696f6e223a22000000000000000000000000000000009052519182603e8301613f57926146ca565b01602e0190601082017f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c69659052603082017f722e636f6d222c226e616d65223a2200000000000000000000000000000000009052519182603f8301613fba926146ca565b01601001602f81017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b62619052604f81017f736536342c0000000000000000000000000000000000000000000000000000009052815191826054830191610220510191614024926146ca565b01602f01602581017f227d000000000000000000000000000000000000000000000000000000000000905203602501601d19810182526002016140679082614710565b6102c0819052614076906156c7565b90805180926102205182017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000905280519081603d8401916102205101916140bc926146ca565b810103603d01601f19810183526140d39083614710565b5180916102205182526102205182016140eb916146eb565b0390f35b86516140fc608082614710565b605b81527fe29d95494e464f3a2054686973204e4654206973206e6f6e2d7472616e736665610220518201527f7261626c652e2049742063616e6e6f7420626520736f6c64206f72207472616e888201527f7366657272656420746f20616e6f74686572206163636f756e742e00000000006102005182015291613bed565b9050610220513d61022051116141c0575b6141968183614710565b816102205191810103126141bc57516001600160a01b03811681036141bc5760036139ad565b5f80fd5b503d61418c565b83513d5f823e3d90fd5b50600161394d565b6040516141e861012082614710565b60f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e34343963610220518201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d610200518201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e64610180518201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d22610100518201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e00000000000000006101205182015290612010565b60405161433b6101c082614710565b61019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e30323620343135610220518201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c70610200518201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e303736610180518201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e363234610100518201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e610120518201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c33838201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015295611dd3565b61455591945061454f614e00565b90615832565b925f61195e565b905099610ad6565b9050610a2e565b601b60d09a610721565b634e487b7160e01b5f52604160045260245ffd5b6145ab915060203d6020116145b1575b6145a38183614710565b81019061475a565b5f610519565b503d614599565b6040513d5f823e3d90fd5b6145dc915060203d6020116145b1576145a38183614710565b5f6104ba565b634e487b7160e01b5f52601260045260245ffd5b614618915060203d60201161461e575b6146108183614710565b810190614732565b5f61024e565b503d614606565b506020813d60201161465a575b8161463f60209383614710565b810103126141bc575160058110156141bc576101f5906101eb565b3d9150614632565b61467b915060203d60201161461e576146108183614710565b5f610191565b90506020813d6020116146c2575b8161469c60209383614710565b810103126141bc57516001600160a01b03811681036141bc576001600160a01b0361010f565b3d915061468f565b5f5b8381106146db5750505f910152565b81810151838201526020016146cc565b90602091614704815180928185528580860191016146ca565b601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff82111761457557604052565b908160209103126141bc57516fffffffffffffffffffffffffffffffff811681036141bc5790565b908160209103126141bc575164ffffffffff811681036141bc5790565b67ffffffffffffffff811161457557601f01601f191660200190565b3d156147bd573d906147a482614777565b916147b26040519384614710565b82523d5f602084013e565b606090565b6020818303126141bc5780519067ffffffffffffffff82116141bc570181601f820112156141bc5780516147f581614777565b926148036040519485614710565b818452602082840101116141bc5761482191602080850191016146ca565b90565b6001600160a01b0316604051906395d89b4160e01b82525f82600481845afa9182156145b8575f92614b79575b5060409161489483516148648582614710565b600a81527f5341422d4c4f434b555000000000000000000000000000000000000000000000602082015282615832565b156148d45750506148a781519182614710565b600e81527f5361626c696572204c6f636b7570000000000000000000000000000000000000602082015290565b61491383516148e38582614710565b600e81527f5341422d4c4f434b55502d4c494e000000000000000000000000000000000000602082015282615832565b8015614b34575b1561495a57505061492d81519182614710565b601581527f5361626c696572204c6f636b7570204c696e6561720000000000000000000000602082015290565b61499983516149698582614710565b600e81527f5341422d4c4f434b55502d44594e000000000000000000000000000000000000602082015282615832565b8015614aef575b156149e05750506149b381519182614710565b601681527f5361626c696572204c6f636b75702044796e616d696300000000000000000000602082015290565b614a1f83516149ef8582614710565b600e81527f5341422d4c4f434b55502d545241000000000000000000000000000000000000602082015282615832565b8015614aaa575b15614a66575050614a3981519182614710565b601781527f5361626c696572204c6f636b7570205472616e63686564000000000000000000602082015290565b614aa69083519384937f16ee429d0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301906146eb565b0390fd5b50614aea8351614aba8582614710565b601181527f5341422d56322d4c4f434b55502d545241000000000000000000000000000000602082015282615832565b614a26565b50614b2f8351614aff8582614710565b601181527f5341422d56322d4c4f434b55502d44594e000000000000000000000000000000602082015282615832565b6149a0565b50614b748351614b448582614710565b601181527f5341422d56322d4c4f434b55502d4c494e000000000000000000000000000000602082015282615832565b61491a565b614b969192503d805f833e614b8e8183614710565b8101906147c2565b905f614851565b6001600160a01b03168060405191614bb6606084614710565b602a8352602083016040368237835115614c855760309053825160011015614c85576078602184015360295b60018111614c235750614bf3575090565b7fe22e27eb000000000000000000000000000000000000000000000000000000005f52600452601460245260445ffd5b90600f81166010811015614c85577f3031323334353637383961626364656600000000000000000000000000000000901a614c5e838661585f565b5360041c908015614c71575f1901614be2565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f809160405160208101906395d89b4160e01b825260048152614cbd602482614710565b51915afa614cc9614793565b90158015614db9575b614d7d5780602080614ce9935183010191016147c2565b601e8151115f14614d305750604051614d03604082614710565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b614d3981615870565b15614d415790565b50604051614d50604082614710565b601281527f556e737570706f727465642053796d626f6c0000000000000000000000000000602082015290565b50604051614d8c604082614710565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b50604081511115614cd2565b60405190614dd4604083614710565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b60405190614e0f604083614710565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b6005811015614f275760048103614e555750614821614e00565b60038103614e995750604051614e6c604082614710565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b60018103614edd5750604051614eb0604082614710565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b600203614eec57614821614dc5565b604051614efa604082614710565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b5f52602160045260245ffd5b5f809160405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152614f78602482614710565b51915afa614f84614793565b9080614fb3575b15614fae576020818051810103126141bc576020015160ff811681036141bc5790565b505f90565b506020815114614f8b565b60405190614fcd604083614710565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190615008604083614710565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b9061505f9493615090602061509f95615082828096816040519c8d8b83829d519485930191016146ca565b8901615073825180938580850191016146ca565b010191828151948592016146ca565b0191828151948592016146ca565b0103601f198101845283614710565b565b908115615376578061536657505b8060018110156151185750506150c3614ff9565b61482160026020604051846150e182965180928580860191016146ca565b81017f2031000000000000000000000000000000000000000000000000000000000000838201520301601d19810184520182614710565b66038d7ea4c680001115615308576040519060a0820182811067ffffffffffffffff821117614575576040526020916040516151548482614710565b5f8152815260409182516151688482614710565b600181527f4b00000000000000000000000000000000000000000000000000000000000000858201528483015282516151a18482614710565b600181527f4d00000000000000000000000000000000000000000000000000000000000000858201528383015282516151da8482614710565b600181527f420000000000000000000000000000000000000000000000000000000000000085820152606083015282516152148482614710565b600181527f54000000000000000000000000000000000000000000000000000000000000008582015260808301525f905f945b6103e88210156152ee5784519461525e8187614710565b600786527f2623383830353b000000000000000000000000000000000000000000000000008287015251945f5b600781106152db575050600160fd1b602786015250600884526152c2906152bc906152b7602887614710565b615568565b91615a13565b916005851015614c85576148219460051b015192615034565b818101830151878201840152820161528b565b9490915060016103e86064600a8504069304910194615247565b50615311614fbe565b614821600860206040518461532f82965180928580860191016146ca565b81017f203939392e393954000000000000000000000000000000000000000000000000838201520301601719810184520182614710565b600a0a9081156145e257046150af565b5050604051615386604082614710565b60018152600360fc1b602082015290565b620151809103048061540157506153ac614ff9565b61482160066020604051846153ca82965180928580860191016146ca565b81017f2031204461790000000000000000000000000000000000000000000000000000838201520301601919810184520182614710565b61270f81116154d8576001810361549457614821615456604051615426604082614710565b600481527f2044617900000000000000000000000000000000000000000000000000000000602082015292615568565b6020604051938261547086945180928580880191016146ca565b8301615484825180938580850191016146ca565b010103601f198101835282614710565b6148216154566040516154a8604082614710565b600581527f2044617973000000000000000000000000000000000000000000000000000000602082015292615568565b506154e1614fbe565b614821600a6020604051846154ff82965180928580860191016146ca565b81017f2039393939204461797300000000000000000000000000000000000000000000838201520301601519810184520182614710565b9061554082614777565b61554d6040519182614710565b828152809261555e601f1991614777565b0190602036910137565b805f917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000082101561569f575b806d04ee2d6d415b85acef8100000000600a921015615684575b662386f26fc10000811015615670575b6305f5e10081101561565f575b612710811015615650575b6064811015615642575b1015615637575b600a60216155f260018501615536565b938401015b5f1901917f30313233343536373839616263646566000000000000000000000000000000008282061a835304801561563257600a90916155f7565b505090565b6001909101906155e2565b6064600291049301926155db565b612710600491049301926155d1565b6305f5e100600891049301926155c6565b662386f26fc10000601091049301926155b9565b6d04ee2d6d415b85acef8100000000602091049301926155a9565b50604091507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000810461558f565b9081511561581c57604051916156de606084614710565b604083527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208401527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040840152805160028101809111614c7157600390047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614c71576157749060021b615536565b90602082019080815182019560208701908151925f83525b8881106157ce57505060039394959650525106806001146157bc576002146157b2575090565b603d905f19015390565b50603d90815f19820153600119015390565b600360049199969901986001603f8b5182828260121c16870101518453828282600c1c16870101518385015382828260061c168701015160028501531684010151600382015301949761578c565b905060405161582c602082614710565b5f815290565b9081518151908181149384615849575b5050505090565b602092939450820120920120145f808080615842565b908151811015614c85570160200190565b8051905f5b82811061588457505050600190565b7fff000000000000000000000000000000000000000000000000000000000000006158af828461585f565b5116600160fd1b811490600360fc1b811015806159e9575b7f410000000000000000000000000000000000000000000000000000000000000082101590816159be575b7f61000000000000000000000000000000000000000000000000000000000000008310159283615993575b8415615969575b508315615961575b508215615959575b508115615951575b501561594a57600101615875565b5050505f90565b90505f61593c565b91505f615934565b92505f61592c565b7f2d000000000000000000000000000000000000000000000000000000000000001493505f615924565b7f7a00000000000000000000000000000000000000000000000000000000000000811115935061591d565b7f5a0000000000000000000000000000000000000000000000000000000000000083111591506158f2565b507f39000000000000000000000000000000000000000000000000000000000000008111156158c7565b80615a27575060405161582c602082614710565b600a811015615a8d57615a3990615568565b614821602260405180937f2e300000000000000000000000000000000000000000000000000000000000006020830152615a7c81518092602086860191016146ca565b81010301601f198101835282614710565b615a9690615568565b614821602160405180937f2e000000000000000000000000000000000000000000000000000000000000006020830152615a7c81518092602086860191016146ca565b60405190615ae8604083614710565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615d4857615b22615ad9565b9061271003906127108211614c7157602e6061916050615b4461482195615568565b60576040519788947f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208701527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8701527f7374726f6b653d22000000000000000000000000000000000000000000000000604f870152615bd1815180926020868a0191016146ca565b85017f22207374726f6b652d77696474683d223130222f3e0000000000000000000000838201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615c5882518093602060a7850191016146ca565b01017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b838201527f652d646173686f66667365743d220000000000000000000000000000000000006070820152615cb9825180936020607e850191016146ca565b01017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d838201527f77696474683d223522207472616e73666f726d3d22726f74617465282d393029604e8201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000606e820152631e17b39f60e11b608b82015203016041810184520182614710565b505060405161582c602082614710565b600d61509f9193929360206040519582615d7b88945180928580880191016146ca565b830164010714051160dd1b8382015267029b0b13634b2b9160c51b6025820152615dae8251809385602d850191016146ca565b01010301601f198101845283614710565b600561509f9193929360206040519582615de288945180928580880191016146ca565b830164010714051160dd1b83820152615dae82518093856025850191016146ca565b6004811015614f275780615e4e5750604051615e21604082614710565b600881527f50726f6772657373000000000000000000000000000000000000000000000000602082015290565b60018103615e925750604051615e65604082614710565b600681527f5374617475730000000000000000000000000000000000000000000000000000602082015290565b600203615ed457604051615ea7604082614710565b600681527f416d6f756e740000000000000000000000000000000000000000000000000000602082015290565b604051615ee2604082614710565b600881527f4475726174696f6e000000000000000000000000000000000000000000000000602082015290565b5f908051801561594a5790600d915f925f925b828410615f355750505050600d02900390565b90919294603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615f69888561585f565b511614615f7f575b820194600101929190615f22565b859450615f71565b5f908051801561594a57906010915f925f925b828410615fad575050505060041b900390565b90919294603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615fe1888561585f565b511614615ff7575b820194600101929190615f9a565b859450615fe956fea164736f6c634300081a000a"; + hex"6080604052348015600e575f80fd5b50616ee08061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063e9dc63751461002d575b5f80fd5b61004760048036038101906100429190612f96565b61005d565b604051610054919061305e565b60405180910390f35b6060610067612ddd565b838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506100a884610960565b8160c001819052506100cf8473ffffffffffffffffffffffffffffffffffffffff16610d32565b8160e001819052506100e3815f0151610d5f565b81602001819052508060a0015173ffffffffffffffffffffffffffffffffffffffff1663a80fc071846040518263ffffffff1660e01b8152600401610128919061308d565b602060405180830381865afa158015610143573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061016791906130eb565b81604001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff16815250506101e26040518060400160405280600e81526020017f5361626c696572204c6f636b75700000000000000000000000000000000000008152508260c00151610f2190919063ffffffff16565b1561029e578060a0015173ffffffffffffffffffffffffffffffffffffffff1663a4775772846040518263ffffffff1660e01b8152600401610224919061308d565b602060405180830381865afa15801561023f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102639190613151565b815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506103de565b5f8473ffffffffffffffffffffffffffffffffffffffff16846040516024016102c7919061308d565b6040516020818303038152906040527feac8f5b8000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161035191906131c0565b5f60405180830381855afa9150503d805f8114610389576040519150601f19603f3d011682016040523d82523d5f602084013e61038e565b606091505b50915050808060200190518101906103a69190613211565b825f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050505b6104628160a0015173ffffffffffffffffffffffffffffffffffffffff1663ad35efd4856040518263ffffffff1660e01b815260040161041e919061308d565b602060405180830381865afa158015610439573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045d919061325f565b610f48565b8161012001819052506104f48160a0015173ffffffffffffffffffffffffffffffffffffffff16634869e12d856040518263ffffffff1660e01b81526004016104ab919061308d565b602060405180830381865afa1580156104c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ea91906130eb565b826040015161112b565b816101600181815250506106d3604051806101400160405280610517878761117f565b815260200161054a84604001516fffffffffffffffffffffffffffffffff16610542865f0151611282565b60ff16611371565b8152602001610571845f015173ffffffffffffffffffffffffffffffffffffffff16610d32565b81526020018360200151815260200161068e8460a0015173ffffffffffffffffffffffffffffffffffffffff1663bc2be1be886040518263ffffffff1660e01b81526004016105c0919061308d565b602060405180830381865afa1580156105db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ff91906132c4565b64ffffffffff168560a0015173ffffffffffffffffffffffffffffffffffffffff16639067b677896040518263ffffffff1660e01b8152600401610643919061308d565b602060405180830381865afa15801561065e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068291906132c4565b64ffffffffff166116ca565b81526020018360e0015181526020018360c0015181526020016106b5846101600151611862565b815260200183610160015181526020018361012001518152506118bf565b8161014001819052508060a0015173ffffffffffffffffffffffffffffffffffffffff1683604051602401610708919061308d565b60405160208183030381529060405263b256456960e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161075a91906131c0565b5f60405180830381855afa9150503d805f8114610792576040519150601f19603f3d011682016040523d82523d5f602084013e610797565b606091505b5082610180018361010001829052821515151581525050508061018001516107c05760016107da565b8061010001518060200190518101906107d99190613324565b5b816060019015159081151581525050610896816020015161088b8360a0015173ffffffffffffffffffffffffffffffffffffffff1663b971302a876040518263ffffffff1660e01b8152600401610831919061308d565b602060405180830381865afa15801561084c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108709190613379565b73ffffffffffffffffffffffffffffffffffffffff16610d32565b836101200151611ac8565b6108dd8260c0015183602001518460e001516108ca865f015173ffffffffffffffffffffffffffffffffffffffff16610d32565b6108d389611af7565b8760600151611bc1565b6108f38360c001516108ee87611af7565b611c3e565b610901846101400151611c6a565b6040516020016109149493929190613530565b60405160208183030381529060405281608001819052506109388160800151611c6a565b60405160200161094891906135d6565b60405160208183030381529060405291505092915050565b60605f8273ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156109ab573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906109d39190613719565b9050610a1d6040518060400160405280600a81526020017f5341422d4c4f434b55500000000000000000000000000000000000000000000081525082610f2190919063ffffffff16565b15610a60576040518060400160405280600e81526020017f5361626c696572204c6f636b7570000000000000000000000000000000000000815250915050610d2d565b610aa86040518060400160405280600e81526020017f5341422d4c4f434b55502d4c494e00000000000000000000000000000000000081525082610f2190919063ffffffff16565b80610af75750610af66040518060400160405280601181526020017f5341422d56322d4c4f434b55502d4c494e00000000000000000000000000000081525082610f2190919063ffffffff16565b5b15610b3a576040518060400160405280601581526020017f5361626c696572204c6f636b7570204c696e6561720000000000000000000000815250915050610d2d565b610b826040518060400160405280600e81526020017f5341422d4c4f434b55502d44594e00000000000000000000000000000000000081525082610f2190919063ffffffff16565b80610bd15750610bd06040518060400160405280601181526020017f5341422d56322d4c4f434b55502d44594e00000000000000000000000000000081525082610f2190919063ffffffff16565b5b15610c14576040518060400160405280601681526020017f5361626c696572204c6f636b75702044796e616d696300000000000000000000815250915050610d2d565b610c5c6040518060400160405280600e81526020017f5341422d4c4f434b55502d54524100000000000000000000000000000000000081525082610f2190919063ffffffff16565b80610cab5750610caa6040518060400160405280601181526020017f5341422d56322d4c4f434b55502d54524100000000000000000000000000000081525082610f2190919063ffffffff16565b5b15610cee576040518060400160405280601781526020017f5361626c696572204c6f636b7570205472616e63686564000000000000000000815250915050610d2d565b82816040517f16ee429d000000000000000000000000000000000000000000000000000000008152600401610d249291906137bb565b60405180910390fd5b919050565b6060610d588273ffffffffffffffffffffffffffffffffffffffff16601460ff16611dd7565b9050919050565b60605f808373ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040526395d89b4160e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610dd291906131c0565b5f60405180830381855afa9150503d805f8114610e0a576040519150601f19603f3d011682016040523d82523d5f602084013e610e0f565b606091505b5091509150811580610e2357506040815111155b15610e67576040518060400160405280600581526020017f455243323000000000000000000000000000000000000000000000000000000081525092505050610f1c565b5f81806020019051810190610e7c9190613719565b9050601e81511115610ec8576040518060400160405280600b81526020017f4c6f6e672053796d626f6c0000000000000000000000000000000000000000008152509350505050610f1c565b610ed181612015565b610f15576040518060400160405280601281526020017f556e737570706f727465642053796d626f6c00000000000000000000000000008152509350505050610f1c565b8093505050505b919050565b5f81518351148015610f40575081805190602001208380519060200120145b905092915050565b6060600480811115610f5d57610f5c6137e9565b5b826004811115610f7057610f6f6137e9565b5b03610fb2576040518060400160405280600881526020017f4465706c657465640000000000000000000000000000000000000000000000008152509050611126565b60036004811115610fc657610fc56137e9565b5b826004811115610fd957610fd86137e9565b5b0361101b576040518060400160405280600881526020017f43616e63656c65640000000000000000000000000000000000000000000000008152509050611126565b6001600481111561102f5761102e6137e9565b5b826004811115611042576110416137e9565b5b03611084576040518060400160405280600981526020017f53747265616d696e6700000000000000000000000000000000000000000000008152509050611126565b60026004811115611098576110976137e9565b5b8260048111156110ab576110aa6137e9565b5b036110ed576040518060400160405280600781526020017f536574746c6564000000000000000000000000000000000000000000000000008152509050611126565b6040518060400160405280600781526020017f50656e64696e670000000000000000000000000000000000000000000000000081525090505b919050565b5f816fffffffffffffffffffffffffffffffff1661271084026fffffffffffffffffffffffffffffffff168161116457611163613816565b5b046fffffffffffffffffffffffffffffffff16905092915050565b60605f4690505f81858560405160200161119b939291906138a8565b604051602081830303815290604052805190602001205f1c90505f61016860108363ffffffff16901c63ffffffff16816111d8576111d7613816565b5b0663ffffffff1690505f6014605060ff60088663ffffffff16901c1663ffffffff168161120857611207613816565b5b060163ffffffff1690505f601e604660ff861663ffffffff168161122f5761122e613816565b5b060163ffffffff16905061124283611af7565b61124b83611af7565b61125483611af7565b6040516020016112669392919061397c565b6040516020818303038152906040529550505050505092915050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1660405160240160405160208183030381529060405263313ce56760e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516112f491906131c0565b5f60405180830381855afa9150503d805f811461132c576040519150601f19603f3d011682016040523d82523d5f602084013e611331565b606091505b5091509150818015611344575060208151145b15611366578080602001905181019061135d9190613a1e565b9250505061136c565b5f925050505b919050565b60605f83036113b7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506116c4565b5f8083146113d85782600a0a84816113d2576113d1613816565b5b046113da565b835b90506001811015611442576040518060400160405280600481526020017f266c743b0000000000000000000000000000000000000000000000000000000081525060405160200161142b9190613a6f565b6040516020818303038152906040529150506116c4565b66038d7ea4c6800081106114ad576040518060400160405280600481526020017f2667743b000000000000000000000000000000000000000000000000000000008152506040516020016114969190613aba565b6040516020818303038152906040529150506116c4565b5f6040518060a0016040528060405180602001604052805f81525081526020016040518060400160405280600181526020017f4b0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f4d0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f420000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f540000000000000000000000000000000000000000000000000000000000000081525081525090505f805f90505b6103e8841061160d576064600a85816115db576115da613816565b5b04816115ea576115e9613816565b5b0691506103e884816115ff576115fe613816565b5b0493506001810190506115bf565b5f6040518060400160405280600781526020017f2623383830353b000000000000000000000000000000000000000000000000008152506040516020016116549190613b05565b60405160208183030381529060405290505f61166f86611af7565b90505f61167b85612213565b905082828288876005811061169357611692613b2a565b5b60200201516040516020016116ab9493929190613b57565b6040516020818303038152906040529750505050505050505b92915050565b60605f62015180848403816116e2576116e1613816565b5b0490505f8103611749576040518060400160405280600481526020017f266c743b000000000000000000000000000000000000000000000000000000008152506040516020016117329190613bba565b60405160208183030381529060405291505061185c565b61270f8111156117b0576040518060400160405280600481526020017f2667743b000000000000000000000000000000000000000000000000000000008152506040516020016117999190613c05565b60405160208183030381529060405291505061185c565b5f600182146117f4576040518060400160405280600581526020017f204461797300000000000000000000000000000000000000000000000000000081525061182b565b6040518060400160405280600481526020017f20446179000000000000000000000000000000000000000000000000000000008152505b905061183682611af7565b81604051602001611848929190613c2a565b604051602081830303815290604052925050505b92915050565b60605f61187a6064846118759190613c4d565b612213565b90505f61189260648561188d9190613caa565b611af7565b905080826040516020016118a7929190613d00565b60405160208183030381529060405292505050919050565b60606118c9612e81565b6118e95f8460e001516118e4866101000151875f015161229a565b612330565b8261012001836101000182905282815250505061190c600184610120015161240b565b8261018001836101600182905282815250505061192e6002846020015161240b565b82602001835f0182905282815250505061194d6003846080015161240b565b8260c0018360a00182905282815250505060036010028161018001518261012001518360c00151846020015101010101816080018181525050600281608001516103e8038161199f5761199e613816565b5b048161014001818152505060108161012001518261014001510101816101a00181815250506010816101800151826101a00151010181604001818152505060108160200151826040015101018160e0018181525050806101000151816101600151825f01518360a00151604051602001611a1c9493929190613b57565b604051602081830303815290604052816060018190525060405180610100016040528060c78152602001615c0060c79139611a64845f01518561012001518460600151612432565b611a808560a001518660c00151876040015188606001516124df565b611a9e846101400151856101a0015186604001518760e0015161268d565b604051602001611ab19493929190613dee565b604051602081830303815290604052915050919050565b6060838383604051602001611adf93929190613f71565b60405160208183030381529060405290509392505050565b60605f6001611b05846126df565b0190505f8167ffffffffffffffff811115611b2357611b22613603565b5b6040519080825280601f01601f191660200182016040528015611b555781602001600182028036833780820191505090505b5090505f82602001820190505b600115611bb6578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611bab57611baa613816565b5b0494505f8503611b62575b819350505050919050565b60605f82611be7576040518060800160405280605b8152602001615ba5605b9139611c01565b6040518060c00160405280609b8152602001615e23609b91395b90508787858a898b8a87604051602001611c22989796959493929190614173565b6040516020818303038152906040529150509695505050505050565b60608282604051602001611c539291906142a0565b604051602081830303815290604052905092915050565b60605f825103611c8a5760405180602001604052805f8152509050611dd2565b5f604051806060016040528060408152602001615de36040913990505f600360028551611cb791906142e1565b611cc19190613caa565b6004611ccd9190614314565b67ffffffffffffffff811115611ce657611ce5613603565b5b6040519080825280601f01601f191660200182016040528015611d185781602001600182028036833780820191505090505b509050600182016020820185865187016020810180515f82525b82841015611d8d576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865360018601955050611d32565b80825260038a510660018114611daa5760028114611dbd57611dc5565b603d6001870353603d6002870353611dc5565b603d60018703535b5050505050505080925050505b919050565b60605f8390505f6002846002611ded9190614314565b611df791906142e1565b67ffffffffffffffff811115611e1057611e0f613603565b5b6040519080825280601f01601f191660200182016040528015611e425781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611e7957611e78613b2a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611edc57611edb613b2a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001856002611f1a9190614314565b611f2491906142e1565b90505b6001811115611fc3577f3031323334353637383961626364656600000000000000000000000000000000600f841660108110611f6657611f65613b2a565b5b1a60f81b828281518110611f7d57611f7c613b2a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600483901c925080611fbc90614355565b9050611f27565b505f821461200a5784846040517fe22e27eb00000000000000000000000000000000000000000000000000000000815260040161200192919061437c565b60405180910390fd5b809250505092915050565b5f808290505f815190505f5b81811015612206575f83828151811061203d5761203c613b2a565b5b602001015160f81c60f81b90505f602060f81b827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161490505f602d60f81b837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161490505f603060f81b847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156120ff5750603960f81b847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b90505f604160f81b857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015801561215e5750605a60f81b857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b90505f606160f81b867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156121bd5750607a60f81b867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b905084806121c85750835b806121d05750825b806121d85750815b806121e05750805b6121f5575f995050505050505050505061220e565b505050505050806001019050612021565b506001925050505b919050565b60605f82036122325760405180602001604052805f8152509050612295565b600a82101561226a5761224482611af7565b60405160200161225491906143c9565b6040516020818303038152906040529050612295565b61227382611af7565b6040516020016122839190614414565b60405160208183030381529060405290505b919050565b60605f83036122b95760405180602001604052805f815250905061232a565b6040518060400160405280601081526020017f68736c283233302c3231252c313125290000000000000000000000000000000081525082612306856127106123019190614439565b611af7565b604051602001612318939291906146c4565b60405160208183030381529060405290505b92915050565b5f60605f61233d86612830565b90505f6003811115612352576123516137e9565b5b866003811115612365576123646137e9565b5b036123a35761238b60405180602001604052805f81525085610f2190919063ffffffff16565b15612399576090925061239e565b60d092505b6123d0565b5f6123ae825f6129aa565b90505f6123bc8760016129aa565b905060286123ca8383612a6f565b01945050505b806123da84611af7565b8287876040516020016123f19594939291906149cd565b604051602081830303815290604052915050935093915050565b5f6060612427848460405180602001604052805f815250612330565b915091509250929050565b60606040518060600160405280603381526020016169e06033913960405180610140016040528061011c8152602001615cc761011c9139604051806103a0016040528061037b8152602001615ebe61037b91396040518060a0016040528060758152602001615887607591396124a788612a87565b6124b088612c22565b876040516020016124c79796959493929190614ade565b60405160208183030381529060405290509392505050565b60606125416040518060400160405280600581526020017f2d31303025000000000000000000000000000000000000000000000000000000815250868660405160200161252d929190614b86565b604051602081830303815290604052612db1565b6125a16040518060400160405280600281526020017f3025000000000000000000000000000000000000000000000000000000000000815250878760405160200161258d929190614b86565b604051602081830303815290604052612db1565b6126016040518060400160405280600481526020017f2d3530250000000000000000000000000000000000000000000000000000000081525086866040516020016125ed929190614bc7565b604051602081830303815290604052612db1565b6126616040518060400160405280600381526020017f3530250000000000000000000000000000000000000000000000000000000000815250878760405160200161264d929190614bc7565b604051602081830303815290604052612db1565b6040516020016126749493929190614c69565b6040516020818303038152906040529050949350505050565b606061269885611af7565b6126a185611af7565b6126aa85611af7565b6126b385611af7565b6040516020016126c69493929190614f40565b6040516020818303038152906040529050949350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061273b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161273157612730613816565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612778576d04ee2d6d415b85acef8100000000838161276e5761276d613816565b5b0492506020810190505b662386f26fc1000083106127a757662386f26fc10000838161279d5761279c613816565b5b0492506010810190505b6305f5e10083106127d0576305f5e10083816127c6576127c5613816565b5b0492506008810190505b61271083106127f55761271083816127eb576127ea613816565b5b0492506004810190505b60648310612818576064838161280e5761280d613816565b5b0492506002810190505b600a8310612827576001810190505b80915050919050565b60605f6003811115612845576128446137e9565b5b826003811115612858576128576137e9565b5b0361289a576040518060400160405280600881526020017f50726f677265737300000000000000000000000000000000000000000000000081525090506129a5565b600160038111156128ae576128ad6137e9565b5b8260038111156128c1576128c06137e9565b5b03612903576040518060400160405280600681526020017f537461747573000000000000000000000000000000000000000000000000000081525090506129a5565b60026003811115612917576129166137e9565b5b82600381111561292a576129296137e9565b5b0361296c576040518060400160405280600681526020017f416d6f756e74000000000000000000000000000000000000000000000000000081525090506129a5565b6040518060400160405280600881526020017f4475726174696f6e00000000000000000000000000000000000000000000000081525090505b919050565b5f80835190505f81036129c0575f915050612a69565b5f836129cd57600d6129d0565b60105b60ff1690505f805f90505b83811015612a5d577f3b00000000000000000000000000000000000000000000000000000000000000878281518110612a1757612a16613b2a565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603612a4d578091505b82850194508060010190506129db565b50808202840393505050505b92915050565b5f818311612a7d5781612a7f565b825b905092915050565b60605f826040518060400160405280601081526020017f68736c283233302c3231252c3131252900000000000000000000000000000000815250604051602001612ad29291906150fa565b60405160208183030381529060405290505f836040518060400160405280601081526020017f68736c283233302c3231252c3131252900000000000000000000000000000000815250604051602001612b2c929190615233565b60405160208183030381529060405290505f6040518060400160405280601081526020017f68736c283233302c3231252c313125290000000000000000000000000000000081525085604051602001612b869291906153d8565b60405160208183030381529060405290505f856040518060400160405280601081526020017f68736c283233302c3231252c3131252900000000000000000000000000000000815250604051602001612be0929190615564565b604051602081830303815290604052905083838383604051602001612c089493929190613b57565b604051602081830303815290604052945050505050919050565b60605f612c6d6040518060400160405280600781526020017f536574746c65640000000000000000000000000000000000000000000000000081525084610f2190919063ffffffff16565b80612cbc5750612cbb6040518060400160405280600881526020017f4465706c6574656400000000000000000000000000000000000000000000000081525084610f2190919063ffffffff16565b5b90506040518060c0016040528060908152602001616e4460909139604051806102c001604052806102988152602001616bac610298913982612d1957604051806101c001604052806101998152602001616a136101999139612d29565b60405180602001604052805f8152505b83612d4d5760405180610120016040528060f88152602001615aad60f89139612d6a565b604051806101e001604052806101b181526020016158fc6101b191395b604051806107e001604052806107a781526020016162396107a79139604051602001612d9a959493929190615603565b604051602081830303815290604052915050919050565b60608282604051602001612dc692919061582f565b604051602081830303815290604052905092915050565b604051806101a001604052805f73ffffffffffffffffffffffffffffffffffffffff168152602001606081526020015f6fffffffffffffffffffffffffffffffff1681526020015f15158152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081526020016060815260200160608152602001606081526020015f81526020015f151581525090565b604051806101c00160405280606081526020015f81526020015f8152602001606081526020015f8152602001606081526020015f81526020015f8152602001606081526020015f81526020015f8152602001606081526020015f81526020015f81525090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612f2182612ef8565b9050919050565b5f612f3282612f17565b9050919050565b612f4281612f28565b8114612f4c575f80fd5b50565b5f81359050612f5d81612f39565b92915050565b5f819050919050565b612f7581612f63565b8114612f7f575f80fd5b50565b5f81359050612f9081612f6c565b92915050565b5f8060408385031215612fac57612fab612ef0565b5b5f612fb985828601612f4f565b9250506020612fca85828601612f82565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561300b578082015181840152602081019050612ff0565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61303082612fd4565b61303a8185612fde565b935061304a818560208601612fee565b61305381613016565b840191505092915050565b5f6020820190508181035f8301526130768184613026565b905092915050565b61308781612f63565b82525050565b5f6020820190506130a05f83018461307e565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6130ca816130a6565b81146130d4575f80fd5b50565b5f815190506130e5816130c1565b92915050565b5f60208284031215613100576130ff612ef0565b5b5f61310d848285016130d7565b91505092915050565b5f61312082612f17565b9050919050565b61313081613116565b811461313a575f80fd5b50565b5f8151905061314b81613127565b92915050565b5f6020828403121561316657613165612ef0565b5b5f6131738482850161313d565b91505092915050565b5f81519050919050565b5f81905092915050565b5f61319a8261317c565b6131a48185613186565b93506131b4818560208601612fee565b80840191505092915050565b5f6131cb8284613190565b915081905092915050565b5f6131e082612ef8565b9050919050565b6131f0816131d6565b81146131fa575f80fd5b50565b5f8151905061320b816131e7565b92915050565b5f6020828403121561322657613225612ef0565b5b5f613233848285016131fd565b91505092915050565b60058110613248575f80fd5b50565b5f815190506132598161323c565b92915050565b5f6020828403121561327457613273612ef0565b5b5f6132818482850161324b565b91505092915050565b5f64ffffffffff82169050919050565b6132a38161328a565b81146132ad575f80fd5b50565b5f815190506132be8161329a565b92915050565b5f602082840312156132d9576132d8612ef0565b5b5f6132e6848285016132b0565b91505092915050565b5f8115159050919050565b613303816132ef565b811461330d575f80fd5b50565b5f8151905061331e816132fa565b92915050565b5f6020828403121561333957613338612ef0565b5b5f61334684828501613310565b91505092915050565b61335881612f17565b8114613362575f80fd5b50565b5f815190506133738161334f565b92915050565b5f6020828403121561338e5761338d612ef0565b5b5f61339b84828501613365565b91505092915050565b7f7b2261747472696275746573223a000000000000000000000000000000000000815250565b5f81905092915050565b5f6133de82612fd4565b6133e881856133ca565b93506133f8818560208601612fee565b80840191505092915050565b7f2c226465736372697074696f6e223a2200000000000000000000000000000000815250565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c69655f8201527f722e636f6d222c226e616d65223a220000000000000000000000000000000000602082015250565b5f613484602f836133ca565b915061348f8261342a565b602f82019050919050565b7f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b62615f8201527f736536342c000000000000000000000000000000000000000000000000000000602082015250565b5f6134f46025836133ca565b91506134ff8261349a565b602582019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000815250565b5f61353a826133a4565b600e8201915061354a82876133d4565b915061355582613404565b60108201915061356582866133d4565b915061357082613478565b915061357c82856133d4565b9150613587826134e8565b915061359382846133d4565b915061359e8261350a565b60028201915081905095945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250565b5f6135e0826135b0565b601d820191506135f082846133d4565b915081905092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61363982613016565b810181811067ffffffffffffffff8211171561365857613657613603565b5b80604052505050565b5f61366a612ee7565b90506136768282613630565b919050565b5f67ffffffffffffffff82111561369557613694613603565b5b61369e82613016565b9050602081019050919050565b5f6136bd6136b88461367b565b613661565b9050828152602081018484840111156136d9576136d86135ff565b5b6136e4848285612fee565b509392505050565b5f82601f830112613700576136ff6135fb565b5b81516137108482602086016136ab565b91505092915050565b5f6020828403121561372e5761372d612ef0565b5b5f82015167ffffffffffffffff81111561374b5761374a612ef4565b5b613757848285016136ec565b91505092915050565b5f819050919050565b5f61378361377e61377984612ef8565b613760565b612ef8565b9050919050565b5f61379482613769565b9050919050565b5f6137a58261378a565b9050919050565b6137b58161379b565b82525050565b5f6040820190506137ce5f8301856137ac565b81810360208301526137e08184613026565b90509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f819050919050565b61385d61385882612f63565b613843565b82525050565b5f8160601b9050919050565b5f61387982613863565b9050919050565b5f61388a8261386f565b9050919050565b6138a261389d82612f17565b613880565b82525050565b5f6138b3828661384c565b6020820191506138c38285613891565b6014820191506138d3828461384c565b602082019150819050949350505050565b7f68736c2800000000000000000000000000000000000000000000000000000000815250565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b7f252c000000000000000000000000000000000000000000000000000000000000815250565b7f2529000000000000000000000000000000000000000000000000000000000000815250565b5f613986826138e4565b60048201915061399682866133d4565b91506139a18261390a565b6001820191506139b182856133d4565b91506139bc82613930565b6002820191506139cc82846133d4565b91506139d782613956565b600282019150819050949350505050565b5f60ff82169050919050565b6139fd816139e8565b8114613a07575f80fd5b50565b5f81519050613a18816139f4565b92915050565b5f60208284031215613a3357613a32612ef0565b5b5f613a4084828501613a0a565b91505092915050565b7f2031000000000000000000000000000000000000000000000000000000000000815250565b5f613a7a82846133d4565b9150613a8582613a49565b60028201915081905092915050565b7f203939392e393954000000000000000000000000000000000000000000000000815250565b5f613ac582846133d4565b9150613ad082613a94565b60088201915081905092915050565b7f2000000000000000000000000000000000000000000000000000000000000000815250565b5f613b1082846133d4565b9150613b1b82613adf565b60018201915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f613b6282876133d4565b9150613b6e82866133d4565b9150613b7a82856133d4565b9150613b8682846133d4565b915081905095945050505050565b7f2031204461790000000000000000000000000000000000000000000000000000815250565b5f613bc582846133d4565b9150613bd082613b94565b60068201915081905092915050565b7f2039393939204461797300000000000000000000000000000000000000000000815250565b5f613c1082846133d4565b9150613c1b82613bdf565b600a8201915081905092915050565b5f613c3582856133d4565b9150613c4182846133d4565b91508190509392505050565b5f613c5782612f63565b9150613c6283612f63565b925082613c7257613c71613816565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613cb482612f63565b9150613cbf83612f63565b925082613ccf57613cce613816565b5b828204905092915050565b7f2500000000000000000000000000000000000000000000000000000000000000815250565b5f613d0b82856133d4565b9150613d1782846133d4565b9150613d2282613cda565b6001820191508190509392505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32305f8201527f30302f737667222077696474683d223130303022206865696768743d2231303060208201527f30222076696577426f783d2230203020313030302031303030223e0000000000604082015250565b5f613db2605b836133ca565b9150613dbd82613d32565b605b82019050919050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000815250565b5f613df882613da6565b9150613e0482876133d4565b9150613e1082866133d4565b9150613e1c82856133d4565b9150613e2882846133d4565b9150613e3382613dc8565b60068201915081905095945050505050565b7f5b7b2274726169745f74797065223a22546f6b656e222c2276616c7565223a22815250565b7f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c75655f8201527f223a220000000000000000000000000000000000000000000000000000000000602082015250565b5f613ec56023836133ca565b9150613ed082613e6b565b602382019050919050565b7f227d2c7b2274726169745f74797065223a22537461747573222c2276616c75655f8201527f223a220000000000000000000000000000000000000000000000000000000000602082015250565b5f613f356023836133ca565b9150613f4082613edb565b602382019050919050565b7f227d5d0000000000000000000000000000000000000000000000000000000000815250565b5f613f7b82613e45565b602082019150613f8b82866133d4565b9150613f9682613eb9565b9150613fa282856133d4565b9150613fad82613f29565b9150613fb982846133d4565b9150613fc482613f4b565b600382019150819050949350505050565b7f54686973204e465420726570726573656e74732061207061796d656e742073745f8201527f7265616d20696e2061205361626c696572204c6f636b75702000000000000000602082015250565b5f61402f6039836133ca565b915061403a82613fd5565b603982019050919050565b7f20636f6e74726163742e20546865206f776e6572206f662074686973204e46545f8201527f2063616e207769746864726177207468652073747265616d656420746f6b656e60208201527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000604082015250565b5f6140c5605c836133ca565b91506140d082614045565b605c82019050919050565b7f2e5c6e5c6e2d2053747265616d2049443a200000000000000000000000000000815250565b7f5c6e2d2000000000000000000000000000000000000000000000000000000000815250565b7f20416464726573733a2000000000000000000000000000000000000000000000815250565b7f5c6e5c6e00000000000000000000000000000000000000000000000000000000815250565b5f61417d82614023565b9150614189828b6133d4565b9150614194826140b9565b91506141a0828a6133d4565b91506141ab826140db565b6012820191506141bb82896133d4565b91506141c682614101565b6004820191506141d682886133d4565b91506141e182614127565b600a820191506141f182876133d4565b91506141fc82614101565b60048201915061420c82866133d4565b915061421782614127565b600a8201915061422782856133d4565b91506142328261414d565b60048201915061424282846133d4565b91508190509998505050505050505050565b7f5361626c69657220000000000000000000000000000000000000000000000000815250565b7f2023000000000000000000000000000000000000000000000000000000000000815250565b5f6142aa82614254565b6008820191506142ba82856133d4565b91506142c58261427a565b6002820191506142d582846133d4565b91508190509392505050565b5f6142eb82612f63565b91506142f683612f63565b925082820190508082111561430e5761430d613c7d565b5b92915050565b5f61431e82612f63565b915061432983612f63565b925082820261433781612f63565b9150828204841483151761434e5761434d613c7d565b5b5092915050565b5f61435f82612f63565b91505f820361437157614370613c7d565b5b600182039050919050565b5f60408201905061438f5f83018561307e565b61439c602083018461307e565b9392505050565b7f2e30000000000000000000000000000000000000000000000000000000000000815250565b5f6143d3826143a3565b6002820191506143e382846133d4565b915081905092915050565b7f2e00000000000000000000000000000000000000000000000000000000000000815250565b5f61441e826143ee565b60018201915061442e82846133d4565b915081905092915050565b5f61444382612f63565b915061444e83612f63565b925082820390508181111561446657614465613c7d565b5b92915050565b7f3c672066696c6c3d226e6f6e65223e0000000000000000000000000000000000815250565b7f3c636972636c652063783d22313636222063793d2235302220723d22323222205f8201527f7374726f6b653d22000000000000000000000000000000000000000000000000602082015250565b5f6144ec6028836133ca565b91506144f782614492565b602882019050919050565b7f22207374726f6b652d77696474683d223130222f3e0000000000000000000000815250565b7f3c636972636c652063783d22313636222063793d2235302220706174684c656e5f8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000602082015250565b5f614582603b836133ca565b915061458d82614528565b603b82019050919050565b7f22207374726f6b652d6461736861727261793d22313030303022207374726f6b5f8201527f652d646173686f66667365743d22000000000000000000000000000000000000602082015250565b5f6145f2602e836133ca565b91506145fd82614598565b602e82019050919050565b7f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d5f8201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960208201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000604082015250565b5f614688605d836133ca565b915061469382614608565b605d82019050919050565b7f3c2f673e00000000000000000000000000000000000000000000000000000000815250565b5f6146ce8261446c565b600f820191506146dd826144e0565b91506146e982866133d4565b91506146f482614502565b60158201915061470382614576565b915061470f82856133d4565b915061471a826145e6565b915061472682846133d4565b91506147318261467c565b915061473c8261469e565b600482019150819050949350505050565b7f3c672069643d2200000000000000000000000000000000000000000000000000815250565b7f222066696c6c3d2223666666223e000000000000000000000000000000000000815250565b7f3c726563742077696474683d2200000000000000000000000000000000000000815250565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e30335f8201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060208201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d776964746860408201527f3d2234222f3e0000000000000000000000000000000000000000000000000000606082015250565b5f6148656066836133ca565b9150614870826147bf565b606682019050919050565b7f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d5f8201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060208201527f666f6e742d73697a653d2232327078223e000000000000000000000000000000604082015250565b5f6148fb6051836133ca565b91506149068261487b565b605182019050919050565b7f3c2f746578743e00000000000000000000000000000000000000000000000000815250565b7f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d5f8201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060208201527f666f6e742d73697a653d2232367078223e000000000000000000000000000000604082015250565b5f6149b76051836133ca565b91506149c282614937565b605182019050919050565b5f6149d78261474d565b6007820191506149e782886133d4565b91506149f282614773565b600e82019150614a0182614799565b600d82019150614a1182876133d4565b9150614a1c82614859565b9150614a27826148ef565b9150614a3382866133d4565b9150614a3e82614911565b600782019150614a4d826149ab565b9150614a5982856133d4565b9150614a6482614911565b600782019150614a7482846133d4565b9150614a7f8261469e565b6004820191508190509695505050505050565b7f3c646566733e0000000000000000000000000000000000000000000000000000815250565b7f3c2f646566733e00000000000000000000000000000000000000000000000000815250565b5f614ae882614a92565b600682019150614af8828a6133d4565b9150614b0482896133d4565b9150614b1082886133d4565b9150614b1c82876133d4565b9150614b2882866133d4565b9150614b3482856133d4565b9150614b4082846133d4565b9150614b4b82614ab8565b60078201915081905098975050505050505050565b7f20e280a220000000000000000000000000000000000000000000000000000000815250565b5f614b9182856133d4565b9150614b9c82614b60565b600582019150614bab82614254565b600882019150614bbb82846133d4565b91508190509392505050565b5f614bd282856133d4565b9150614bdd82614b60565b600582019150614bed82846133d4565b91508190509392505050565b7f3c7465787420746578742d72656e646572696e673d226f7074696d697a6553705f8201527f656564223e000000000000000000000000000000000000000000000000000000602082015250565b5f614c536025836133ca565b9150614c5e82614bf9565b602582019050919050565b5f614c7382614c47565b9150614c7f82876133d4565b9150614c8b82866133d4565b9150614c9782856133d4565b9150614ca382846133d4565b9150614cae82614911565b60078201915081905095945050505050565b7f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d225f8201527f2e39222f3e000000000000000000000000000000000000000000000000000000602082015250565b5f614d1a6025836133ca565b9150614d2582614cc0565b602582019050919050565b7f3c75736520687265663d2223476c6f772220783d22313030302220793d2231305f8201527f3030222066696c6c2d6f7061636974793d222e39222f3e000000000000000000602082015250565b5f614d8a6037836133ca565b9150614d9582614d30565b603782019050919050565b7f3c75736520687265663d22234c6f676f2220783d223137302220793d223137305f8201527f22207472616e73666f726d3d227363616c65282e3629222f3e3c75736520687260208201527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460408201527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60608201527f6f726967696e3d2235303020353030222f3e0000000000000000000000000000608082015250565b5f614e6c6092836133ca565b9150614e7782614da0565b609282019050919050565b7f3c75736520687265663d222350726f67726573732220783d2200000000000000815250565b7f2220793d22373930222f3e000000000000000000000000000000000000000000815250565b7f3c75736520687265663d22235374617475732220783d22000000000000000000815250565b7f3c75736520687265663d2223416d6f756e742220783d22000000000000000000815250565b7f3c75736520687265663d22234475726174696f6e2220783d2200000000000000815250565b5f614f4a82614d0e565b9150614f5582614d7e565b9150614f6082614e60565b9150614f6b82614e82565b601982019150614f7b82876133d4565b9150614f8682614ea8565b600b82019150614f9582614ece565b601782019150614fa582866133d4565b9150614fb082614ea8565b600b82019150614fbf82614ef4565b601782019150614fcf82856133d4565b9150614fda82614ea8565b600b82019150614fe982614f1a565b601982019150614ff982846133d4565b915061500482614ea8565b600b8201915081905095945050505050565b7f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e815250565b7f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d220000815250565b7f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000815250565b7f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22815250565b7f222073746f702d6f7061636974793d2230222f3e000000000000000000000000815250565b7f3c2f72616469616c4772616469656e743e000000000000000000000000000000815250565b5f61510482615016565b6020820191506151138261503c565b601e8201915061512382856133d4565b915061512e82615062565b60158201915061513d82615088565b60208201915061514d82846133d4565b9150615158826150ae565b601482019150615167826150d4565b6011820191508190509392505050565b7f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d5f8201527f223025222079313d223025223e00000000000000000000000000000000000000602082015250565b5f6151d1602d836133ca565b91506151dc82615177565b602d82019050919050565b7f222f3e0000000000000000000000000000000000000000000000000000000000815250565b7f3c2f6c696e6561724772616469656e743e000000000000000000000000000000815250565b5f61523d826151c5565b91506152488261503c565b601e8201915061525882856133d4565b9150615263826151e7565b60038201915061527282615088565b60208201915061528282846133d4565b915061528d826151e7565b60038201915061529c8261520d565b6011820191508190509392505050565b7f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d22205f8201527f78313d2231303025222079313d2231303025223e000000000000000000000000602082015250565b5f6153066034836133ca565b9150615311826152ac565b603482019050919050565b7f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d2200815250565b7f3c616e696d617465206174747269627574654e616d653d22783122206475723d5f8201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160208201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e0000604082015250565b5f6153c2605e836133ca565b91506153cd82615342565b605e82019050919050565b5f6153e2826152fa565b91506153ed8261531c565b601f820191506153fd82856133d4565b9150615408826151e7565b60038201915061541782615088565b60208201915061542782846133d4565b9150615432826151e7565b600382019150615441826153b6565b915061544c8261520d565b6011820191508190509392505050565b7f3c6c696e6561724772616469656e742069643d22486f7572676c6173735374725f8201527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960208201527f302922206772616469656e74556e6974733d227573657253706163654f6e557360408201527f65223e0000000000000000000000000000000000000000000000000000000000606082015250565b5f6155026063836133ca565b915061550d8261545c565b606382019050919050565b7f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200815250565b7f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d2200815250565b5f61556e826154f6565b915061557982615518565b601f8201915061558982856133d4565b9150615594826151e7565b6003820191506155a38261553e565b601f820191506155b382846133d4565b91506155be826151e7565b6003820191506155cd8261520d565b6011820191508190509392505050565b7f3c672069643d22486f7572676c617373223e0000000000000000000000000000815250565b5f61560d826155dd565b60128201915061561d82886133d4565b915061562982876133d4565b915061563582866133d4565b915061564182856133d4565b915061564d82846133d4565b91506156588261469e565b6004820191508190509695505050505050565b7f3c74657874506174682073746172744f66667365743d22000000000000000000815250565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366665f8201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260208201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e382260408201527f20666f6e742d73697a653d2232367078223e0000000000000000000000000000606082015250565b5f6157376072836133ca565b915061574282615691565b607282019050919050565b7f3c616e696d6174652061646469746976653d2273756d222061747472696275745f8201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460208201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260408201527f696e646566696e6974652220746f3d2231303025222f3e000000000000000000606082015250565b5f6157f36077836133ca565b91506157fe8261574d565b607782019050919050565b7f3c2f74657874506174683e000000000000000000000000000000000000000000815250565b5f6158398261566b565b60178201915061584982856133d4565b91506158548261572b565b915061585f826157e7565b915061586b82846133d4565b915061587682615809565b600b82019150819050939250505056fe3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f6e652220643d224d313235203435683735307338302030203830203830763735307330203830202d3830203830682d373530732d38302030202d3830202d3830762d3735307330202d3830203830202d3830222f3e3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d35332e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d38316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746820643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d31352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d362e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39372c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d2275726c282353616e64546f7029222f3e3c7061746820643d226d3438312e34362c3530342e3130317635382e343439632d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d35332e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d35382e343339683236322e39325a222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d223530342e313031222072783d223133312e343632222072793d2232382e313038222066696c6c3d2275726c282353616e64546f7029222f3ee29d95494e464f3a2054686973204e4654206973206e6f6e2d7472616e7366657261626c652e2049742063616e6e6f7420626520736f6c64206f72207472616e7366657272656420746f20616e6f74686572206163636f756e742e3c726563742077696474683d223130302522206865696768743d2231303025222066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2237302220793d223730222077696474683d2238363022206865696768743d22383630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3033222072783d223435222072793d22343522207374726f6b653d222366666622207374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474683d2234222f3e3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d22302220793d2230222077696474683d223130302522206865696768743d22313030252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c313125292220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f6446696c6c222f3e3c666554757262756c656e636520626173654672657175656e63793d222e3422206e756d4f6374617665733d22332220726573756c743d224e6f6973652220747970653d226672616374616c4e6f697365222f3e3c6665426c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fe29aa0efb88f205741524e494e473a205472616e7366657272696e6720746865204e4654206d616b657320746865206e6577206f776e65722074686520726563697069656e74206f66207468652073747265616d2e205468652066756e647320617265206e6f74206175746f6d61746963616c6c792077697468647261776e20666f72207468652070726576696f757320726563697069656e742e3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303334632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3833382d312e3237322d32362e3332382d332e3636332d392e3830362d322e3736362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33352e323635683063322e3033352d312e3833382c342e3235322d332e3534362c362e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e3831362c392e3634392c31332e39322c31332e373334682e30333763352e3733362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c302c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34392d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731392d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337352c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e323539683063322e30362d312e3336322c332e3935312d322e3632312c362e3034342d332e3834324335372e3736332d332e3437332c39372e37362d322e3334312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32362e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e3831312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735322c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630312c322e3731342c332e38342c322e3733382c362e3139325a222f3e3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f7572676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3130372e323863302c392e3533372d352e35362c31382e3632392d31352e3637362c32362e393733682d2e303233632d392e3230342c372e3539362d32322e3139342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c31342e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e3335352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935332d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e3637362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733352c39362e3535342d37312e3932312c3231352e3635322d37312e393231733231352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c7061746820643d226d3133342e33362c3136312e32303363302c33392e3733352c39362e3535342c37312e3932312c3231352e3635322c37312e393231733231352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e652078313d223133342e3336222079313d223136312e323033222078323d223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d223536352e3634222079313d223136312e323033222078323d223536352e3634222079323d223130372e3238222f3e3c6c696e652078313d223138342e353834222079313d223230362e383233222078323d223138342e353835222079323d223533372e353739222f3e3c6c696e652078313d223231382e313831222079313d223231382e313138222078323d223231382e313831222079323d223536322e353337222f3e3c6c696e652078313d223438312e383138222079313d223231382e313432222078323d223438312e383139222079323d223536322e343238222f3e3c6c696e652078313d223531352e343135222079313d223230372e333532222078323d223531352e343136222079323d223533372e353739222f3e3c7061746820643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31302e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31322e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37382e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c39332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c352e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c31322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438352d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33342e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c372e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c38322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e3336332d352e3539352c3133312e3830372d31352e3030326331302e3834372d322e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e3532342d31392e313733682e3032326331302e3131342d382e3334322c31352e3637372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c7061746820643d226d3133342e33362c3539322e373263302c33392e3733352c39362e3535342c37312e3932312c3231352e3635322c37312e393231733231352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e652078313d223133342e3336222079313d223539322e3732222078323d223133342e3336222079323d223533382e373937222f3e3c6c696e652078313d223536352e3634222079313d223539322e3732222078323d223536352e3634222079323d223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438312e383232203438312e393031203438312e373938203438312e383737203438312e373735203438312e383534203335302e303135203335302e303236203231382e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d223231382e313835203438312e393031203231382e323331203438312e383534203335302e303135203335302e303236203438312e383232203231382e313532222f3e3c2f673e3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2275726c282352616469616c476c6f7729222f3e3c706f6c79676f6e20706f696e74733d22333530203335302e303236203431352e3033203238342e39373820323835203238342e39373820333530203335302e303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e3335342c312e3830392d312e3033352c322e36382d352e3534322c372e3037362d33322e3636312c31322e34352d36352e32382c31322e34352d33322e3632342c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e3638312d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c33322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34352e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637365a222066696c6c3d2275726c282353616e64546f7029222f3e3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3139382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3135322e3538372d32312e303739732d3131312e3833382c372e3438372d3135322e3630322c32312e303739632d34302e3839332c31332e3633362d36332e3431332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e333934763238342e383039632d33322e3531392c31322e39362d35302e3232332c32392e3230362d35302e3232332c34362e3339347635332e39323463302c31392e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e3630322c32312e303739733131312e3833312d372e3438372c3135322e3538372d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e3831362c36332e3339382d35312e313938762d35332e39323463302d31372e3139362d31372e3730342d33332e3433352d35302e3232332d34362e343031563230372e3630336333322e3531392d31322e3936372c35302e3232332d32392e3230362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e3739336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e303133563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a222066696c6c3d2223313631383232223e3c2f706174683e3c7061746820643d224d2035302c3336302061203330302c333030203020312c31203630302c302061203330302c333030203020312c31202d3630302c30222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207374726f6b653d2275726c2823486f7572676c6173735374726f6b652922207374726f6b652d77696474683d2234222f3ea164736f6c634300081a000a"; uint256 public constant MAX_COUNT = 500; diff --git a/shell/prepare-artifacts.sh b/shell/prepare-artifacts.sh index 9349325ec..7800ed105 100755 --- a/shell/prepare-artifacts.sh +++ b/shell/prepare-artifacts.sh @@ -8,7 +8,7 @@ set -euo pipefail # Generate the artifacts with Forge -FOUNDRY_PROFILE=optimized forge build +forge build # Delete the current artifacts artifacts=./artifacts @@ -26,21 +26,21 @@ mkdir $artifacts \ ################################################ lockup=./artifacts/ -cp out-optimized/LockupNFTDescriptor.sol/LockupNFTDescriptor.json $lockup -cp out-optimized/SablierLockup.sol/SablierLockup.json $lockup -cp out-optimized/SablierBatchLockup.sol/SablierBatchLockup.json $lockup +cp out/LockupNFTDescriptor.sol/LockupNFTDescriptor.json $lockup +cp out/SablierLockup.sol/SablierLockup.json $lockup +cp out/SablierBatchLockup.sol/SablierBatchLockup.json $lockup lockup_interfaces=./artifacts/interfaces -cp out-optimized/ISablierBatchLockup.sol/ISablierBatchLockup.json $lockup_interfaces -cp out-optimized/ILockupNFTDescriptor.sol/ILockupNFTDescriptor.json $lockup_interfaces -cp out-optimized/ISablierLockupRecipient.sol/ISablierLockupRecipient.json $lockup_interfaces -cp out-optimized/ISablierLockupBase.sol/ISablierLockupBase.json $lockup_interfaces -cp out-optimized/ISablierLockup.sol/ISablierLockup.json $lockup_interfaces +cp out/ISablierBatchLockup.sol/ISablierBatchLockup.json $lockup_interfaces +cp out/ILockupNFTDescriptor.sol/ILockupNFTDescriptor.json $lockup_interfaces +cp out/ISablierLockupRecipient.sol/ISablierLockupRecipient.json $lockup_interfaces +cp out/ISablierLockupBase.sol/ISablierLockupBase.json $lockup_interfaces +cp out/ISablierLockup.sol/ISablierLockup.json $lockup_interfaces lockup_libraries=./artifacts/libraries -cp out-optimized/Errors.sol/Errors.json $lockup_libraries -cp out-optimized/Helpers.sol/Helpers.json $lockup_libraries -cp out-optimized/VestingMath.sol/VestingMath.json $lockup_libraries +cp out/Errors.sol/Errors.json $lockup_libraries +cp out/Helpers.sol/Helpers.json $lockup_libraries +cp out/VestingMath.sol/VestingMath.json $lockup_libraries ################################################ @@ -48,11 +48,11 @@ cp out-optimized/VestingMath.sol/VestingMath.json $lockup_libraries ################################################ erc20=./artifacts/erc20 -cp out-optimized/IERC20.sol/IERC20.json $erc20 +cp out/IERC20.sol/IERC20.json $erc20 erc721=./artifacts/erc721 -cp out-optimized/IERC721.sol/IERC721.json $erc721 -cp out-optimized/IERC721Metadata.sol/IERC721Metadata.json $erc721 +cp out/IERC721.sol/IERC721.json $erc721 +cp out/IERC721Metadata.sol/IERC721Metadata.json $erc721 # Format the artifacts with Prettier bun prettier --write ./artifacts diff --git a/shell/update-counts.sh b/shell/update-counts.sh index f9c0cd97f..5186f4687 100755 --- a/shell/update-counts.sh +++ b/shell/update-counts.sh @@ -11,8 +11,8 @@ set -euo pipefail # Path to the Base Script BASE_SCRIPT="script/Base.s.sol" -# Compile the contracts with the optimized profile -bun run build:optimized +# Compile the contracts +bun run build # Generalized function to update counts update_counts() { diff --git a/shell/update-precompiles.sh b/shell/update-precompiles.sh index abcbf9f42..db3217fce 100755 --- a/shell/update-precompiles.sh +++ b/shell/update-precompiles.sh @@ -9,12 +9,12 @@ set -euo pipefail # Compile the contracts with Forge -FOUNDRY_PROFILE=optimized forge build +forge build # Retrieve the raw bytecodes, removing the "0x" prefix -batch_lockup=$(cat out-optimized/SablierBatchLockup.sol/SablierBatchLockup.json | jq -r '.bytecode.object' | cut -c 3-) -lockup=$(cat out-optimized/SablierLockup.sol/SablierLockup.json | jq -r '.bytecode.object' | cut -c 3-) -nft_descriptor=$(cat out-optimized/LockupNFTDescriptor.sol/LockupNFTDescriptor.json | jq -r '.bytecode.object' | cut -c 3-) +batch_lockup=$(cat out/SablierBatchLockup.sol/SablierBatchLockup.json | jq -r '.bytecode.object' | cut -c 3-) +lockup=$(cat out/SablierLockup.sol/SablierLockup.json | jq -r '.bytecode.object' | cut -c 3-) +nft_descriptor=$(cat out/LockupNFTDescriptor.sol/LockupNFTDescriptor.json | jq -r '.bytecode.object' | cut -c 3-) precompiles_path="precompiles/Precompiles.sol" if [ ! -f $precompiles_path ]; then diff --git a/tests/Base.t.sol b/tests/Base.t.sol index 8a921bd2b..a7a2c9daf 100644 --- a/tests/Base.t.sol +++ b/tests/Base.t.sol @@ -6,9 +6,6 @@ import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { ILockupNFTDescriptor } from "src/interfaces/ILockupNFTDescriptor.sol"; import { ISablierBatchLockup } from "src/interfaces/ISablierBatchLockup.sol"; import { ISablierLockup } from "src/interfaces/ISablierLockup.sol"; -import { LockupNFTDescriptor } from "src/LockupNFTDescriptor.sol"; -import { SablierBatchLockup } from "src/SablierBatchLockup.sol"; -import { SablierLockup } from "src/SablierLockup.sol"; import { Lockup, LockupDynamic, LockupLinear, LockupTranched } from "src/types/DataTypes.sol"; import { ERC20MissingReturn } from "./mocks/erc20/ERC20MissingReturn.sol"; @@ -144,13 +141,8 @@ abstract contract Base_Test is Assertions, Calculations, DeployOptimized, Modifi /// deployer's nonce, which would in turn lead to different addresses (recall that the addresses /// for contracts deployed via `CREATE` are based on the caller-and-nonce-hash). function deployProtocolConditionally() internal { - if (!isBenchmarkProfile() && !isTestOptimizedProfile()) { - batchLockup = new SablierBatchLockup(); - nftDescriptor = new LockupNFTDescriptor(); - lockup = new SablierLockup(users.admin, nftDescriptor, defaults.MAX_COUNT()); - } else { - (nftDescriptor, lockup, batchLockup) = deployOptimizedProtocol(users.admin, defaults.MAX_COUNT()); - } + (nftDescriptor, lockup, batchLockup) = deployOptimizedProtocol(users.admin, defaults.MAX_COUNT()); + vm.label({ account: address(batchLockup), newLabel: "BatchLockup" }); vm.label({ account: address(lockup), newLabel: "Lockup" }); vm.label({ account: address(nftDescriptor), newLabel: "NFTDescriptor" }); diff --git a/tests/unit/shared/Adminable.t.sol b/tests/unit/shared/Adminable.t.sol index 9a0ffe2b8..d3b4603b2 100644 --- a/tests/unit/shared/Adminable.t.sol +++ b/tests/unit/shared/Adminable.t.sol @@ -15,12 +15,8 @@ abstract contract Adminable_Unit_Shared_Test is Base_Test { /// @dev Conditionally deploys {AdminableMock} normally or from a source precompiled with `--via-ir`. function deployConditionally() internal { - if (!isTestOptimizedProfile()) { - adminableMock = new AdminableMock(users.admin); - } else { - adminableMock = - AdminableMock(deployCode("out-optimized/AdminableMock.sol/AdminableMock.json", abi.encode(users.admin))); - } + adminableMock = AdminableMock(deployCode("out/AdminableMock.sol/AdminableMock.json", abi.encode(users.admin))); + vm.label({ account: address(adminableMock), newLabel: "AdminableMock" }); } } diff --git a/tests/utils/DeployOptimized.sol b/tests/utils/DeployOptimized.sol index cfd6256e9..283a231a9 100644 --- a/tests/utils/DeployOptimized.sol +++ b/tests/utils/DeployOptimized.sol @@ -11,13 +11,13 @@ import { ISablierLockup } from "../../src/interfaces/ISablierLockup.sol"; abstract contract DeployOptimized is StdCheats, CommonBase { /// @dev Deploys {SablierBatchLockup} from an optimized source compiled with `--via-ir`. function deployOptimizedBatchLockup() internal returns (ISablierBatchLockup) { - return ISablierBatchLockup(deployCode("out-optimized/SablierBatchLockup.sol/SablierBatchLockup.json")); + return ISablierBatchLockup(deployCode("out/SablierBatchLockup.sol/SablierBatchLockup.json")); } /// @dev Deploys the optimized {Helpers} and {VestingMath} libraries and assign them to linked addresses. function deployOptimizedLibraries() internal { - address helpers = deployCode("out-optimized/Helpers.sol/Helpers.json"); - address vestingMath = deployCode("out-optimized/VestingMath.sol/VestingMath.json"); + address helpers = deployCode("out/Helpers.sol/Helpers.json"); + address vestingMath = deployCode("out/VestingMath.sol/VestingMath.json"); vm.etch(0x7715bE116061E014Bb721b46Dc78Dd57C91FDF9b, helpers.code); vm.etch(0x26F9d826BDed47Fc472526aE8095B75ac336963C, vestingMath.code); } @@ -37,15 +37,14 @@ abstract contract DeployOptimized is StdCheats, CommonBase { // Deploy the Lockup contract. return ISablierLockup( deployCode( - "out-optimized/SablierLockup.sol/SablierLockup.json", - abi.encode(initialAdmin, address(nftDescriptor_), maxCount) + "out/SablierLockup.sol/SablierLockup.json", abi.encode(initialAdmin, address(nftDescriptor_), maxCount) ) ); } /// @dev Deploys {LockupNFTDescriptor} from an optimized source compiled with `--via-ir`. function deployOptimizedNFTDescriptor() internal returns (ILockupNFTDescriptor) { - return ILockupNFTDescriptor(deployCode("out-optimized/LockupNFTDescriptor.sol/LockupNFTDescriptor.json")); + return ILockupNFTDescriptor(deployCode("out/LockupNFTDescriptor.sol/LockupNFTDescriptor.json")); } /// @notice Deploys all contracts from an optimized source compiled with `--via-ir` in the following order: diff --git a/tests/utils/Precompiles.t.sol b/tests/utils/Precompiles.t.sol index 731ce4a4d..ce7ae051f 100644 --- a/tests/utils/Precompiles.t.sol +++ b/tests/utils/Precompiles.t.sol @@ -14,32 +14,26 @@ contract Precompiles_Test is Base_Test { Precompiles internal precompiles = new Precompiles(); - modifier onlyTestOptimizedProfile() { - if (isTestOptimizedProfile()) { - _; - } - } - - function test_DeployBatchLockup() external onlyTestOptimizedProfile { + function test_DeployBatchLockup() external { address actualBatchLockup = address(precompiles.deployBatchLockup()); address expectedBatchLockup = address(deployOptimizedBatchLockup()); assertEq(actualBatchLockup.code, expectedBatchLockup.code, "bytecodes mismatch"); } - function test_DeployLockup() external onlyTestOptimizedProfile { + function test_DeployLockup() external { address actualLockup = address(precompiles.deployLockup(users.admin, nftDescriptor)); address expectedLockup = address(deployOptimizedLockup(users.admin, nftDescriptor, precompiles.MAX_COUNT())); bytes memory expectedLockupCode = adjustBytecode(expectedLockup.code, expectedLockup, actualLockup); assertEq(actualLockup.code, expectedLockupCode, "bytecodes mismatch"); } - function test_DeployNFTDescriptor() external onlyTestOptimizedProfile { + function test_DeployNFTDescriptor() external { address actualNFTDescriptor = address(precompiles.deployNFTDescriptor()); address expectedNFTDescriptor = address(deployOptimizedNFTDescriptor()); assertEq(actualNFTDescriptor.code, expectedNFTDescriptor.code, "bytecodes mismatch"); } - function test_DeployProtocol() external onlyTestOptimizedProfile { + function test_DeployProtocol() external { (ILockupNFTDescriptor actualNFTDescriptor, ISablierLockup actualLockup, ISablierBatchLockup actualBatchLockup) = precompiles.deployProtocol(users.admin); diff --git a/tests/utils/Utils.sol b/tests/utils/Utils.sol index 578299e1f..ca0e37317 100644 --- a/tests/utils/Utils.sol +++ b/tests/utils/Utils.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.8.22; -import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; import { PRBMathUtils } from "@prb/math/test/utils/Utils.sol"; import { CommonBase } from "forge-std/src/Base.sol"; @@ -67,18 +66,6 @@ abstract contract Utils is CommonBase, PRBMathUtils { } } - /// @dev Checks if the Foundry profile is "benchmark". - function isBenchmarkProfile() internal view returns (bool) { - string memory profile = vm.envOr({ name: "FOUNDRY_PROFILE", defaultValue: string("default") }); - return Strings.equal(profile, "benchmark"); - } - - /// @dev Checks if the Foundry profile is "test-optimized". - function isTestOptimizedProfile() internal view returns (bool) { - string memory profile = vm.envOr({ name: "FOUNDRY_PROFILE", defaultValue: string("default") }); - return Strings.equal(profile, "test-optimized"); - } - /// @dev Returns the largest of the provided `uint40` numbers. function maxOfTwo(uint40 a, uint40 b) internal pure returns (uint40) { uint40 max = a;