Repository: raiden-network/raiden-contracts

Issue:
Change the TokenNetwork constructor so that limits are configurable at the deployment time

Discussion:

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ecfa2c1..fc1d164 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@ Documents changes that result in:
 
 ## Unreleased
 
+- TokenNetworkRegistry's constructor takes an additional argument `max_number_of_token_networks`
 - Removed flavors
 
 ## [0.12.0](https://github.com/raiden-network/raiden-contracts/releases/tag/v0.12.0) - 2019-02-28
diff --git a/README.rst b/README.rst
index 873809e..20f1f8c 100644
--- a/README.rst
+++ b/README.rst
@@ -170,7 +170,7 @@ Check deployment options::
 
 Deploying the main Raiden Network contracts with the ``raiden`` command::
 
-    python -m raiden_contracts.deploy raiden --rpc-provider http://127.0.0.1:8545 --private-key /path/to/your/private_key/file --gas-price 10 --gas-limit 6000000
+    python -m raiden_contracts.deploy raiden --rpc-provider http://127.0.0.1:8545 --private-key /path/to/your/private_key/file --gas-price 10 --gas-limit 6000000 --max-token-networks 1
 
 Deploying the mock token contract for paying for the services (not to be done on the mainnet)::
 
diff --git a/raiden_contracts/contracts/raiden/TokenNetworkRegistry.sol b/raiden_contracts/contracts/raiden/TokenNetworkRegistry.sol
index 75c14f9..ca1c414 100644
--- a/raiden_contracts/contracts/raiden/TokenNetworkRegistry.sol
+++ b/raiden_contracts/contracts/raiden/TokenNetworkRegistry.sol
@@ -15,10 +15,11 @@ contract TokenNetworkRegistry is Utils {
     uint256 public chain_id;
     uint256 public settlement_timeout_min;
     uint256 public settlement_timeout_max;
+    uint256 public max_token_networks;
 
     // Only for the limited Red Eyes release
     address public deprecation_executor;
-    bool public token_network_created = false;
+    uint256 public token_network_created = 0;
 
     // Token address => TokenNetwork address
     mapping(address => address) public token_to_token_networks;
@@ -26,7 +27,7 @@ contract TokenNetworkRegistry is Utils {
     event TokenNetworkCreated(address indexed token_address, address indexed token_network_address);
 
     modifier canCreateTokenNetwork() {
-        require(token_network_created == false);
+        require(token_network_created < max_token_networks);
         _;
     }
 
@@ -34,7 +35,8 @@ contract TokenNetworkRegistry is Utils {
         address _secret_registry_address,
         uint256 _chain_id,
         uint256 _settlement_timeout_min,
-        uint256 _settlement_timeout_max
+        uint256 _settlement_timeout_max,
+        uint256 _max_token_networks
     )
         public
     {
@@ -44,10 +46,12 @@ contract TokenNetworkRegistry is Utils {
         require(_settlement_timeout_max > _settlement_timeout_min);
         require(_secret_registry_address != address(0x0));
         require(contractExists(_secret_registry_address));
+        require(_max_token_networks > 0);
         secret_registry_address = _secret_registry_address;
         chain_id = _chain_id;
         settlement_timeout_min = _settlement_timeout_min;
         settlement_timeout_max = _settlement_timeout_max;
+        max_token_networks = _max_token_networks;
 
         deprecation_executor = msg.sender;
     }
@@ -57,14 +61,14 @@ contract TokenNetworkRegistry is Utils {
     /// @param _token_address Ethereum address of an already deployed token, to
     /// be used in the new TokenNetwork contract.
     function createERC20TokenNetwork(address _token_address)
-         canCreateTokenNetwork 
+        canCreateTokenNetwork
         external
         returns (address token_network_address)
     {
         require(token_to_token_networks[_token_address] == address(0x0));
 
         // We limit the number of token networks to 1 for the Bug Bounty release
-        token_network_created = true;
+        token_network_created = token_network_created + 1;
 
         TokenNetwork token_network;
 
diff --git a/raiden_contracts/data/contracts.json b/raiden_contracts/data/contracts.json
index c716978..dde1de4 100644
--- a/raiden_contracts/data/contracts.json
+++ b/raiden_contracts/data/contracts.json
@@ -4037,6 +4037,20 @@
                     "stateMutability": "view",
                     "type": "function"
                 },
+                {
+                    "constant": true,
+                    "inputs": [],
+                    "name": "max_token_networks",
+                    "outputs": [
+                        {
+                            "name": "",
+                            "type": "uint256"
+                        }
+                    ],
+                    "payable": false,
+                    "stateMutability": "view",
+                    "type": "function"
+                },
                 {
                     "constant": true,
                     "inputs": [],
@@ -4058,7 +4072,7 @@
                     "outputs": [
                         {
                             "name": "",
-                            "type": "bool"
+                            "type": "uint256"
                         }
                     ],
                     "payable": false,
@@ -4110,6 +4124,10 @@
                         {
                             "name": "_settlement_timeout_max",
                             "type": "uint256"
+                        },
+                        {
+                            "name": "_max_token_networks",
+                            "type": "uint256"
                         }
                     ],
                     "payable": false,
@@ -4134,9 +4152,9 @@
                     "type": "event"
                 }
             ],
-            "bin": "60806040526000600460146101000a81548160ff02191690831515021790555034801561002b57600080fd5b506040516080806144aa8339810180604052608081101561004b57600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919050505060008311151561008957600080fd5b60008211151561009857600080fd5b6000811115156100a757600080fd5b81811115156100b557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156100f157600080fd5b610109846101b3640100000000026401000000009004565b151561011457600080fd5b836000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600181905550816002819055508060038190555033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506101c6565b600080823b905060008111915050919050565b6142d5806101d56000396000f3fe608060405234801561001057600080fd5b50600436106100bb576000357c0100000000000000000000000000000000000000000000000000000000900480637709bc78116100835780637709bc781461024e578063b32c65c8146102aa578063b61c40831461032d578063b8378f751461034f578063d0ad4bec1461036d576100bb565b80630fabd9e7146100c0578063224df42f1461014457806323aa8174146101625780633af973b1146101ac5780634cf71a04146101ca575b600080fd5b610102600480360360208110156100d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506103b7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61014c6103ea565b6040518082815260200191505060405180910390f35b61016a6103f0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101b4610416565b6040518082815260200191505060405180910390f35b61020c600480360360208110156101e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061041c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102906004803603602081101561026457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610705565b604051808215151515815260200191505060405180910390f35b6102b2610718565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102f25780820151818401526020810190506102d7565b50505050905090810190601f16801561031f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610335610751565b604051808215151515815260200191505060405180910390f35b610357610764565b6040518082815260200191505060405180910390f35b61037561076a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015481565b6000801515600460149054906101000a900460ff16151514151561043f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156104d957600080fd5b6001600460146101000a81548160ff0219169083151502179055506000826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600154600254600354600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516105519061078f565b808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019650505050505050604051809103906000f08015801561061e573d6000803e3d6000fd5b50905080915081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff11a7558a113d9627989c5edf26cbd19143b7375248e621c8e30ac9e0847dc3f60405160405180910390a381915050919050565b600080823b905060008111915050919050565b6040805190810160405280600581526020017f302e382e3000000000000000000000000000000000000000000000000000000081525081565b600460149054906101000a900460ff1681565b60025481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b613b0d8061079d8339019056fe60806040526000600660146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405160c08062003b0d833981018060405260c08110156200004e57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515620000ce57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156200010b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156200014857600080fd5b6000841115156200015857600080fd5b6000831115156200016857600080fd5b82821115156200017757600080fd5b620001918662000376640100000000026401000000009004565b15156200019d57600080fd5b620001b78562000376640100000000026401000000009004565b1515620001c357600080fd5b856000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600281905550826003819055508160048190555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015620002df57600080fd5b505afa158015620002f4573d6000803e3d6000fd5b505050506040513d60208110156200030b57600080fd5b81019080805190602001909291905050501115156200032957600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505062000389565b600080823b905060008111915050919050565b61377480620003996000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637c4734f411610116578063b8378f75116100b4578063ee4516d91161008e578063ee4516d914610aa7578063fadc554b14610b57578063fc0c546a14610c8e578063fe49ba1c14610cd8576101e1565b8063b8378f751461092f578063db45479b1461094d578063e5949b5d14610a50576101e1565b8063938bcd67116100f0578063938bcd67146107675780639cadb159146107df578063b32c65c81461088a578063b7506d701461090d576101e1565b80637c4734f4146105d5578063838d6e051461064d57806387234237146106e4576101e1565b80634845be761161018357806363ea01431161015d57806363ea0143146104c5578063679b37631461053d57806371e759921461055b5780637709bc7814610579576101e1565b80634845be7614610447578063524bef8a146104655780635d6e441b146104a7576101e1565b8063224df42f116101bf578063224df42f1461037757806323aa81741461039557806324d73a93146103df5780633af973b114610429576101e1565b806303d9d253146101e65780630a798f24146102eb5780630fcc0c281461036d575b600080fd5b6102e9600480360360808110156101fc57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561026357600080fd5b82018360208201111561027557600080fd5b8035906020019184600183028401116401000000008311171561029757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610d5a565b005b6103576004803603606081101561030157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611128565b6040518082815260200191505060405180910390f35b6103756113d5565b005b61037f611470565b6040518082815260200191505060405180910390f35b61039d611476565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e761149c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104316114c2565b6040518082815260200191505060405180910390f35b61044f6114c8565b6040518082815260200191505060405180910390f35b6104916004803603602081101561047b57600080fd5b81019080803590602001909291905050506114d5565b6040518082815260200191505060405180910390f35b6104af6114ed565b6040518082815260200191505060405180910390f35b61053b600480360360808110156104db57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114f9565b005b610545611951565b6040518082815260200191505060405180910390f35b610563611957565b6040518082815260200191505060405180910390f35b6105bb6004803603602081101561058f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061197b565b604051808215151515815260200191505060405180910390f35b610637600480360360408110156105eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061198e565b6040518082815260200191505060405180910390f35b6106b96004803603606081101561066357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bd0565b604051808381526020018260048111156106cf57fe5b60ff1681526020019250505060405180910390f35b6106ec611cc3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561072c578082015181840152602081019050610711565b50505050905090810190601f1680156107595780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6107c96004803603604081101561077d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cfc565b6040518082815260200191505060405180910390f35b61088860048036036101208110156107f657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611ddb565b005b6108926122ff565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108d25780820151818401526020810190506108b7565b50505050905090810190601f1680156108ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610915612338565b604051808215151515815260200191505060405180910390f35b61093761234b565b6040518082815260200191505060405180910390f35b610a4e600480360360c081101561096357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001906401000000008111156109c857600080fd5b8201836020820111156109da57600080fd5b803590602001918460018302840111640100000000831117156109fc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612351565b005b610a7c60048036036020811015610a6657600080fd5b810190808035906020019092919050505061250d565b60405180838152602001826004811115610a9257fe5b60ff1681526020019250505060405180910390f35b610b1360048036036060811015610abd57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061253e565b604051808881526020018781526020018615151515815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b610c8c6004803603610100811015610b6e57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610bf357600080fd5b820183602082011115610c0557600080fd5b80359060200191846001830284011164010000000083111715610c2757600080fd5b909192939192939080359060200190640100000000811115610c4857600080fd5b820183602082011115610c5a57600080fd5b80359060200191846001830284011164010000000083111715610c7c57600080fd5b9091929391929390505050612613565b005b610c966128d1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d4460048036036060811015610cee57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f6565b6040518082815260200191505060405180910390f35b610d648383611cfc565b8414151515610d7257600080fd5b60006004811115610d7f57fe5b6007600086815260200190815260200160002060010160009054906101000a900460ff166004811115610dae57fe5b141515610dba57600080fd5b60008151111515610dca57600080fd5b6000806000806000610ddb866129e9565b8094508195505050610dee89888a6128f6565b9450600060096000878152602001908152602001600020905080600101549250848160000154141515610e2057600080fd5b600083111515610e2f57600080fd5b610e398484612cfe565b9350838303915060096000878152602001908152602001600020600080820160009055600182016000905550508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168b7f8c03cf01b3d4e6068cc494e6fe02aa9e3d4af069d37c32ecc3b241af5c37e6c088888760405180848152602001838152602001828152602001935050505060405180910390a46000841115610ff0576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b505050506040513d6020811015610fd357600080fd5b81019080805190602001909291905050501515610fef57600080fd5b5b6000821115611104576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110bd57600080fd5b505af11580156110d1573d6000803e3d6000fd5b505050506040513d60208110156110e757600080fd5b8101908080519060200190929190505050151561110357600080fd5b5b81831015151561111057fe5b83831015151561111c57fe5b50505050505050505050565b6000801515600660149054906101000a900460ff16151514151561114b57600080fd5b81600354811015151561115d57600080fd5b600454811115151561116e57600080fd5b600080680d8d726b7177a800006000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561123557600080fd5b505afa158015611249573d6000803e3d6000fd5b505050506040513d602081101561125f57600080fd5b810190808051906020019092919050505010151561127c57600080fd5b6001600560008282540192505081905550600554905061129c878761198e565b9150600060086000848152602001908152602001600020541415156112c057600080fd5b8060086000848152602001908152602001600020819055506000600760008381526020019081526020016000209050600081600001541415156112ff57fe5b6000600481111561130c57fe5b8160010160009054906101000a900460ff16600481111561132957fe5b14151561133257fe5b85816000018190555060018160010160006101000a81548160ff0219169083600481111561135c57fe5b02179055508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16837f669a4b0ac0b9994c0f82ed4dbe07bb421fe74e5951725af4f139c7443ebf049d896040518082815260200191505060405180910390a4819450505050509392505050565b60001515600660149054906101000a900460ff1615151415156113f757600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145357600080fd5b6001600660146101000a81548160ff021916908315150217905550565b60045481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b680d8d726b7177a8000081565b60086020528060005260406000206000915090505481565b67010a741a4627800081565b60001515600660149054906101000a900460ff16151514151561151b57600080fd5b836001600481111561152957fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff16600481111561155857fe5b14151561156457600080fd5b61156e8483611cfc565b8514151561157b57600080fd5b60008311151561158a57600080fd5b67010a741a4627800083111515156115a157600080fd5b600080600060076000898152602001908152602001600020905060008160020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260020160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905081600001548803945060008511151561165d57600080fd5b87851115151561166c57600080fd5b878583600001540114151561167d57fe5b680d8d726b7177a80000856000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561174257600080fd5b505afa158015611756573d6000803e3d6000fd5b505050506040513d602081101561176c57600080fd5b8101908080519060200190929190505050011115151561178b57600080fd5b87826000018190555080600001548260000154019350816000015484101515156117b457600080fd5b8873ffffffffffffffffffffffffffffffffffffffff168a7f2b55547a3b586ab51f65ee9ce4927fa6d25191388299988e89e059a02f9dd44584600001546040518082815260200191505060405180910390a36000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156118ff57600080fd5b505af1158015611913573d6000803e3d6000fd5b505050506040513d602081101561192957600080fd5b8101908080519060200190929190505050151561194557600080fd5b50505050505050505050565b60055481565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b600080823b905060008111915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156119cb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611a0757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611a4257600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161015611b22578282604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051602081830303815290604052805190602001209050611bca565b8183604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040516020818303038152906040528051906020012090505b92915050565b600080600080600060076000898152602001908152602001600020905060008160010160009054906101000a900460ff16905060006004811115611c1057fe5b816004811115611c1c57fe5b148015611c295750600089115b8015611c3757506005548911155b15611cad5760039050611c4b8989896128f6565b93506000600960008681526020019081526020016000209050611c6f8a898b6128f6565b9350600060096000868152602001908152602001600020905060008260010154148015611ca0575060008160010154145b15611caa57600492505b50505b8160000154819550955050505050935093915050565b6040805190810160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611d3957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611d7557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611db057600080fd5b6000611dbc848461198e565b9050600860008281526020019081526020016000205491505092915050565b611de58885611cfc565b89141515611df257600080fd5b6000611dfe898661198e565b90506000600760008c8152602001908152602001600020905060026004811115611e2457fe5b8160010160009054906101000a900460ff166004811115611e4157fe5b141515611e4d57600080fd5b438160000154101515611e5f57600080fd5b60008160020160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611ef5828c8c8c612d17565b1515611f0057600080fd5b611f0c81888888612d17565b1515611f1757600080fd5b611f25828c8c848b8b612da0565b809950819d50829a50839e50505050508260020160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549060ff02191690556003820160009055600482016000905550508260020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549060ff0219169055600382016000905560048201600090555050600760008e81526020019081526020016000206000808201600090556001820160006101000a81549060ff02191690555050600860008581526020019081526020016000206000905561207b8d8d8a8d8d612eaf565b6120888d898e8989612eaf565b8c7f0e239ef20c651bd0bc45e6f6a5fd46252d77d39d6602103e347add00cabdb0b48c89604051808381526020018281526020019250505060405180910390a260008b11156121dc576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8d8d6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561219557600080fd5b505af11580156121a9573d6000803e3d6000fd5b505050506040513d60208110156121bf57600080fd5b810190808051906020019092919050505015156121db57600080fd5b5b60008711156122f0576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156122a957600080fd5b505af11580156122bd573d6000803e3d6000fd5b505050506040513d60208110156122d357600080fd5b810190808051906020019092919050505015156122ef57600080fd5b5b50505050505050505050505050565b6040805190810160405280600581526020017f302e382e3000000000000000000000000000000000000000000000000000000081525081565b600660149054906101000a900460ff1681565b60035481565b856001600481111561235f57fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff16600481111561238e57fe5b14151561239a57600080fd5b6123a43387611cfc565b871415156123b157600080fd5b600080600760008a8152602001908152602001600020905060028160010160006101000a81548160ff021916908360048111156123ea57fe5b021790555060018160020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff02191690831515021790555043816000016000828254019250508190555060008611156124bd576124748988888888612f0d565b91508173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415156124b057600080fd5b6124bc8183888a6130e3565b5b853373ffffffffffffffffffffffffffffffffffffffff168a7f5fe3d4a343010393184843ef4873386b572e844e89f6b41c9f60f5ab912fbdfe60405160405180910390a4505050505050505050565b60076020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16905082565b6000806000806000806000806000600760008d815260200190815260200160002060020160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506125ac8c8c8c6128f6565b91506000600960008481526020019081526020016000209050816000015482600101548360020160009054906101000a900460ff16846003015485600401548560000154866001015499509950995099509950995099505050509397509397509397909450565b61261d8989611cfc565b8a14151561262a57600080fd5b6000600102871415151561263d57600080fd5b60008611151561264c57600080fd5b6000806000600760008e815260200190815260200160002090506002600481111561267357fe5b8160010160009054906101000a900460ff16600481111561269057fe5b14151561269c57600080fd5b438160000154101515156126af57600080fd5b6127458d8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613153565b92508273ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614151561278157600080fd5b6127d28d8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612f0d565b91508173ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614151561280e57600080fd5b60008160020160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060020160009054906101000a900460ff16151561287057600080fd5b61287c828e8c8e6130e3565b898d73ffffffffffffffffffffffffffffffffffffffff168f7f09bd10d8ee6f30d654401133d6eac60e091a0d8e13f54005754de9394c11fbd360405160405180910390a45050505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561293357600080fd5b838383604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140193505050506040516020818303038152906040528051906020012090509392505050565b6000806000835190506000606082811515612a0057fe5b06141515612a0d57600080fd5b600080600080600060606001606088811515612a2557fe5b0401604051908082528060200260200182016040528015612a555781602001602082028038833980820191505090505b509050602095505b86861015612ab057612a6f8a8761337f565b809550819450505083850194508281606088811515612a8a57fe5b04815181101515612a9757fe5b9060200190602002018181525050606086019550612a5d565b606087811515612abc57fe5b0496505b6001871115612cd1576000600288811515612ad757fe5b06141515612b1d578060018803815181101515612af057fe5b906020019060200201518188815181101515612b0857fe5b90602001906020020181815250506001870196505b600095505b60018703861015612cbd578060018701815181101515612b3e57fe5b906020019060200201518187815181101515612b5657fe5b906020019060200201511415612b85578086815181101515612b7457fe5b906020019060200201519250612c89565b8060018701815181101515612b9657fe5b906020019060200201518187815181101515612bae57fe5b906020019060200201511015612c25578086815181101515612bcc57fe5b906020019060200201518160018801815181101515612be757fe5b906020019060200201516040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209250612c88565b8060018701815181101515612c3657fe5b906020019060200201518187815181101515612c4e57fe5b9060200190602002015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b5b8281600288811515612c9757fe5b04815181101515612ca457fe5b9060200190602002018181525050600286019550612b22565b600286811515612cc957fe5b049650612ac0565b806000815181101515612ce057fe5b90602001906020020151915081859850985050505050505050915091565b6000818311612d0d5782612d0f565b815b905092915050565b6000806001028560030154148015612d2f5750600084145b8015612d3b5750600083145b8015612d4a5750600060010282145b15612d585760019050612d98565b8383836040516020018084815260200183815260200182815260200193505050506040516020818303038152906040528051906020012085600301541490505b949350505050565b6000806000806000806000612db361371f565b612dbb61371f565b8e600001548260000181815250508e600101548260200181815250508d8260400181815250508c8260600181815250508b600001548160000181815250508b600101548160200181815250508a81604001818152505089816060018181525050612e258f8d6134f1565b9250612e318282613512565b9450612e3d8584612cfe565b94508483039350612e4e858b6135a6565b809b508196505050612e60848e6135a6565b809e508195505050828511151515612e7457fe5b828411151515612e8057fe5b898d858701010183141515612e9157fe5b84848e8c985098509850985050505050509650965096509692505050565b6000821480612ec15750600060010281145b15612ecb57612f06565b6000612ed88686866128f6565b9050600060096000838152602001908152602001600020905082816000018190555083816001018190555050505b5050505050565b600060606040805190810160405280600381526020017f3231320000000000000000000000000000000000000000000000000000000000815250905060006040805190810160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250823060025460016004811115612f9357fe5b8c8c8c8c604051602001808a805190602001908083835b602083101515612fcf5780518252602082019150602081019050602083039250612faa565b6001836020036101000a03801982511681845116808217855250505050505090500189805190602001908083835b6020831015156130225780518252602082019150602081019050602083039250612ffd565b6001836020036101000a0380198251168184511680821785525050505050509050018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187815260200186815260200185815260200184815260200183815260200182815260200199505050505050505050506040516020818303038152906040528051906020012090506130d681856135cb565b9250505095945050505050565b60008460020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600401548311151561313a57600080fd5b8281600401819055508181600301819055505050505050565b600060606040805190810160405280600381526020017f3237370000000000000000000000000000000000000000000000000000000000815250905060006040805190810160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152508230600254600260048111156131d957fe5b8d8d8d8d8d604051602001808b805190602001908083835b60208310151561321657805182526020820191506020810190506020830392506131f1565b6001836020036101000a0380198251168184511680821785525050505050509050018a805190602001908083835b6020831015156132695780518252602082019150602081019050602083039250613244565b6001836020036101000a0380198251168184511680821785525050505050509050018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140188815260200187815260200186815260200185815260200184815260200183815260200182805190602001908083835b60208310151561332157805182526020820191506020810190506020830392506132fc565b6001836020036101000a0380198251168184511680821785525050505050509050019a505050505050505050505060405160208183030381529060405280519060200120905061337181856135cb565b925050509695505050505050565b60008060008060008060008789511115156133a8578060008090509650965050505050506134ea565b878901519450602088018901519350604088018901519150848483604051602001808481526020018381526020018281526020019350505050604051602081830303815290604052805190602001209050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1f62946836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561348857600080fd5b505afa15801561349c573d6000803e3d6000fd5b505050506040513d60208110156134b257600080fd5b8101908080519060200190929190505050925060008314806134d45750828511155b156134de57600093505b80849650965050505050505b9250929050565b60008160010154836001015483600001548560000154010303905092915050565b600080600080600061352c876040015188606001516136de565b9350613540866040015187606001516136de565b925083831015151561355157600080fd5b8660400151841015151561356157fe5b8560400151831015151561357157fe5b83830391506135848288600001516136de565b90506135948188602001516135a6565b50809150508094505050505092915050565b6000808284116135bb576000848191506135c0565b828403835b915091509250929050565b6000604182511415156135dd57600080fd5b60008060006020850151925060408501519150606085015160001a9050601b8160ff16101561360d57601b810190505b601b8160ff1614806136225750601c8160ff16145b151561362d57600080fd5b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561368a573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156136d257600080fd5b83935050505092915050565b600080828401905083811015613714577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613716565b805b91505092915050565b60806040519081016040528060008152602001600081526020016000815260200160008152509056fea165627a7a72305820656cdf73dc8613cacb88247f0856941db1d3229c66937c3f479c36811c177d7b0029a165627a7a723058209fd85d8068ba302a5f56a341d281a1c492be75a6082ba1d070d1bfc08a446e910029",
-            "bin-runtime": "608060405234801561001057600080fd5b50600436106100bb576000357c0100000000000000000000000000000000000000000000000000000000900480637709bc78116100835780637709bc781461024e578063b32c65c8146102aa578063b61c40831461032d578063b8378f751461034f578063d0ad4bec1461036d576100bb565b80630fabd9e7146100c0578063224df42f1461014457806323aa8174146101625780633af973b1146101ac5780634cf71a04146101ca575b600080fd5b610102600480360360208110156100d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506103b7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61014c6103ea565b6040518082815260200191505060405180910390f35b61016a6103f0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101b4610416565b6040518082815260200191505060405180910390f35b61020c600480360360208110156101e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061041c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102906004803603602081101561026457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610705565b604051808215151515815260200191505060405180910390f35b6102b2610718565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102f25780820151818401526020810190506102d7565b50505050905090810190601f16801561031f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610335610751565b604051808215151515815260200191505060405180910390f35b610357610764565b6040518082815260200191505060405180910390f35b61037561076a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015481565b6000801515600460149054906101000a900460ff16151514151561043f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156104d957600080fd5b6001600460146101000a81548160ff0219169083151502179055506000826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600154600254600354600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516105519061078f565b808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019650505050505050604051809103906000f08015801561061e573d6000803e3d6000fd5b50905080915081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff11a7558a113d9627989c5edf26cbd19143b7375248e621c8e30ac9e0847dc3f60405160405180910390a381915050919050565b600080823b905060008111915050919050565b6040805190810160405280600581526020017f302e382e3000000000000000000000000000000000000000000000000000000081525081565b600460149054906101000a900460ff1681565b60025481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b613b0d8061079d8339019056fe60806040526000600660146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405160c08062003b0d833981018060405260c08110156200004e57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515620000ce57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156200010b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156200014857600080fd5b6000841115156200015857600080fd5b6000831115156200016857600080fd5b82821115156200017757600080fd5b620001918662000376640100000000026401000000009004565b15156200019d57600080fd5b620001b78562000376640100000000026401000000009004565b1515620001c357600080fd5b856000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600281905550826003819055508160048190555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015620002df57600080fd5b505afa158015620002f4573d6000803e3d6000fd5b505050506040513d60208110156200030b57600080fd5b81019080805190602001909291905050501115156200032957600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505062000389565b600080823b905060008111915050919050565b61377480620003996000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637c4734f411610116578063b8378f75116100b4578063ee4516d91161008e578063ee4516d914610aa7578063fadc554b14610b57578063fc0c546a14610c8e578063fe49ba1c14610cd8576101e1565b8063b8378f751461092f578063db45479b1461094d578063e5949b5d14610a50576101e1565b8063938bcd67116100f0578063938bcd67146107675780639cadb159146107df578063b32c65c81461088a578063b7506d701461090d576101e1565b80637c4734f4146105d5578063838d6e051461064d57806387234237146106e4576101e1565b80634845be761161018357806363ea01431161015d57806363ea0143146104c5578063679b37631461053d57806371e759921461055b5780637709bc7814610579576101e1565b80634845be7614610447578063524bef8a146104655780635d6e441b146104a7576101e1565b8063224df42f116101bf578063224df42f1461037757806323aa81741461039557806324d73a93146103df5780633af973b114610429576101e1565b806303d9d253146101e65780630a798f24146102eb5780630fcc0c281461036d575b600080fd5b6102e9600480360360808110156101fc57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561026357600080fd5b82018360208201111561027557600080fd5b8035906020019184600183028401116401000000008311171561029757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610d5a565b005b6103576004803603606081101561030157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611128565b6040518082815260200191505060405180910390f35b6103756113d5565b005b61037f611470565b6040518082815260200191505060405180910390f35b61039d611476565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e761149c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104316114c2565b6040518082815260200191505060405180910390f35b61044f6114c8565b6040518082815260200191505060405180910390f35b6104916004803603602081101561047b57600080fd5b81019080803590602001909291905050506114d5565b6040518082815260200191505060405180910390f35b6104af6114ed565b6040518082815260200191505060405180910390f35b61053b600480360360808110156104db57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114f9565b005b610545611951565b6040518082815260200191505060405180910390f35b610563611957565b6040518082815260200191505060405180910390f35b6105bb6004803603602081101561058f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061197b565b604051808215151515815260200191505060405180910390f35b610637600480360360408110156105eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061198e565b6040518082815260200191505060405180910390f35b6106b96004803603606081101561066357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bd0565b604051808381526020018260048111156106cf57fe5b60ff1681526020019250505060405180910390f35b6106ec611cc3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561072c578082015181840152602081019050610711565b50505050905090810190601f1680156107595780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6107c96004803603604081101561077d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cfc565b6040518082815260200191505060405180910390f35b61088860048036036101208110156107f657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611ddb565b005b6108926122ff565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108d25780820151818401526020810190506108b7565b50505050905090810190601f1680156108ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610915612338565b604051808215151515815260200191505060405180910390f35b61093761234b565b6040518082815260200191505060405180910390f35b610a4e600480360360c081101561096357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001906401000000008111156109c857600080fd5b8201836020820111156109da57600080fd5b803590602001918460018302840111640100000000831117156109fc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612351565b005b610a7c60048036036020811015610a6657600080fd5b810190808035906020019092919050505061250d565b60405180838152602001826004811115610a9257fe5b60ff1681526020019250505060405180910390f35b610b1360048036036060811015610abd57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061253e565b604051808881526020018781526020018615151515815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b610c8c6004803603610100811015610b6e57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610bf357600080fd5b820183602082011115610c0557600080fd5b80359060200191846001830284011164010000000083111715610c2757600080fd5b909192939192939080359060200190640100000000811115610c4857600080fd5b820183602082011115610c5a57600080fd5b80359060200191846001830284011164010000000083111715610c7c57600080fd5b9091929391929390505050612613565b005b610c966128d1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d4460048036036060811015610cee57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f6565b6040518082815260200191505060405180910390f35b610d648383611cfc565b8414151515610d7257600080fd5b60006004811115610d7f57fe5b6007600086815260200190815260200160002060010160009054906101000a900460ff166004811115610dae57fe5b141515610dba57600080fd5b60008151111515610dca57600080fd5b6000806000806000610ddb866129e9565b8094508195505050610dee89888a6128f6565b9450600060096000878152602001908152602001600020905080600101549250848160000154141515610e2057600080fd5b600083111515610e2f57600080fd5b610e398484612cfe565b9350838303915060096000878152602001908152602001600020600080820160009055600182016000905550508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168b7f8c03cf01b3d4e6068cc494e6fe02aa9e3d4af069d37c32ecc3b241af5c37e6c088888760405180848152602001838152602001828152602001935050505060405180910390a46000841115610ff0576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b505050506040513d6020811015610fd357600080fd5b81019080805190602001909291905050501515610fef57600080fd5b5b6000821115611104576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110bd57600080fd5b505af11580156110d1573d6000803e3d6000fd5b505050506040513d60208110156110e757600080fd5b8101908080519060200190929190505050151561110357600080fd5b5b81831015151561111057fe5b83831015151561111c57fe5b50505050505050505050565b6000801515600660149054906101000a900460ff16151514151561114b57600080fd5b81600354811015151561115d57600080fd5b600454811115151561116e57600080fd5b600080680d8d726b7177a800006000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561123557600080fd5b505afa158015611249573d6000803e3d6000fd5b505050506040513d602081101561125f57600080fd5b810190808051906020019092919050505010151561127c57600080fd5b6001600560008282540192505081905550600554905061129c878761198e565b9150600060086000848152602001908152602001600020541415156112c057600080fd5b8060086000848152602001908152602001600020819055506000600760008381526020019081526020016000209050600081600001541415156112ff57fe5b6000600481111561130c57fe5b8160010160009054906101000a900460ff16600481111561132957fe5b14151561133257fe5b85816000018190555060018160010160006101000a81548160ff0219169083600481111561135c57fe5b02179055508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16837f669a4b0ac0b9994c0f82ed4dbe07bb421fe74e5951725af4f139c7443ebf049d896040518082815260200191505060405180910390a4819450505050509392505050565b60001515600660149054906101000a900460ff1615151415156113f757600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145357600080fd5b6001600660146101000a81548160ff021916908315150217905550565b60045481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b680d8d726b7177a8000081565b60086020528060005260406000206000915090505481565b67010a741a4627800081565b60001515600660149054906101000a900460ff16151514151561151b57600080fd5b836001600481111561152957fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff16600481111561155857fe5b14151561156457600080fd5b61156e8483611cfc565b8514151561157b57600080fd5b60008311151561158a57600080fd5b67010a741a4627800083111515156115a157600080fd5b600080600060076000898152602001908152602001600020905060008160020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260020160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905081600001548803945060008511151561165d57600080fd5b87851115151561166c57600080fd5b878583600001540114151561167d57fe5b680d8d726b7177a80000856000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561174257600080fd5b505afa158015611756573d6000803e3d6000fd5b505050506040513d602081101561176c57600080fd5b8101908080519060200190929190505050011115151561178b57600080fd5b87826000018190555080600001548260000154019350816000015484101515156117b457600080fd5b8873ffffffffffffffffffffffffffffffffffffffff168a7f2b55547a3b586ab51f65ee9ce4927fa6d25191388299988e89e059a02f9dd44584600001546040518082815260200191505060405180910390a36000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156118ff57600080fd5b505af1158015611913573d6000803e3d6000fd5b505050506040513d602081101561192957600080fd5b8101908080519060200190929190505050151561194557600080fd5b50505050505050505050565b60055481565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b600080823b905060008111915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156119cb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611a0757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611a4257600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161015611b22578282604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051602081830303815290604052805190602001209050611bca565b8183604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040516020818303038152906040528051906020012090505b92915050565b600080600080600060076000898152602001908152602001600020905060008160010160009054906101000a900460ff16905060006004811115611c1057fe5b816004811115611c1c57fe5b148015611c295750600089115b8015611c3757506005548911155b15611cad5760039050611c4b8989896128f6565b93506000600960008681526020019081526020016000209050611c6f8a898b6128f6565b9350600060096000868152602001908152602001600020905060008260010154148015611ca0575060008160010154145b15611caa57600492505b50505b8160000154819550955050505050935093915050565b6040805190810160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611d3957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611d7557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611db057600080fd5b6000611dbc848461198e565b9050600860008281526020019081526020016000205491505092915050565b611de58885611cfc565b89141515611df257600080fd5b6000611dfe898661198e565b90506000600760008c8152602001908152602001600020905060026004811115611e2457fe5b8160010160009054906101000a900460ff166004811115611e4157fe5b141515611e4d57600080fd5b438160000154101515611e5f57600080fd5b60008160020160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611ef5828c8c8c612d17565b1515611f0057600080fd5b611f0c81888888612d17565b1515611f1757600080fd5b611f25828c8c848b8b612da0565b809950819d50829a50839e50505050508260020160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549060ff02191690556003820160009055600482016000905550508260020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549060ff0219169055600382016000905560048201600090555050600760008e81526020019081526020016000206000808201600090556001820160006101000a81549060ff02191690555050600860008581526020019081526020016000206000905561207b8d8d8a8d8d612eaf565b6120888d898e8989612eaf565b8c7f0e239ef20c651bd0bc45e6f6a5fd46252d77d39d6602103e347add00cabdb0b48c89604051808381526020018281526020019250505060405180910390a260008b11156121dc576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8d8d6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561219557600080fd5b505af11580156121a9573d6000803e3d6000fd5b505050506040513d60208110156121bf57600080fd5b810190808051906020019092919050505015156121db57600080fd5b5b60008711156122f0576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156122a957600080fd5b505af11580156122bd573d6000803e3d6000fd5b505050506040513d60208110156122d357600080fd5b810190808051906020019092919050505015156122ef57600080fd5b5b50505050505050505050505050565b6040805190810160405280600581526020017f302e382e3000000000000000000000000000000000000000000000000000000081525081565b600660149054906101000a900460ff1681565b60035481565b856001600481111561235f57fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff16600481111561238e57fe5b14151561239a57600080fd5b6123a43387611cfc565b871415156123b157600080fd5b600080600760008a8152602001908152602001600020905060028160010160006101000a81548160ff021916908360048111156123ea57fe5b021790555060018160020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff02191690831515021790555043816000016000828254019250508190555060008611156124bd576124748988888888612f0d565b91508173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415156124b057600080fd5b6124bc8183888a6130e3565b5b853373ffffffffffffffffffffffffffffffffffffffff168a7f5fe3d4a343010393184843ef4873386b572e844e89f6b41c9f60f5ab912fbdfe60405160405180910390a4505050505050505050565b60076020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16905082565b6000806000806000806000806000600760008d815260200190815260200160002060020160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506125ac8c8c8c6128f6565b91506000600960008481526020019081526020016000209050816000015482600101548360020160009054906101000a900460ff16846003015485600401548560000154866001015499509950995099509950995099505050509397509397509397909450565b61261d8989611cfc565b8a14151561262a57600080fd5b6000600102871415151561263d57600080fd5b60008611151561264c57600080fd5b6000806000600760008e815260200190815260200160002090506002600481111561267357fe5b8160010160009054906101000a900460ff16600481111561269057fe5b14151561269c57600080fd5b438160000154101515156126af57600080fd5b6127458d8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613153565b92508273ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614151561278157600080fd5b6127d28d8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612f0d565b91508173ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614151561280e57600080fd5b60008160020160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060020160009054906101000a900460ff16151561287057600080fd5b61287c828e8c8e6130e3565b898d73ffffffffffffffffffffffffffffffffffffffff168f7f09bd10d8ee6f30d654401133d6eac60e091a0d8e13f54005754de9394c11fbd360405160405180910390a45050505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561293357600080fd5b838383604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140193505050506040516020818303038152906040528051906020012090509392505050565b6000806000835190506000606082811515612a0057fe5b06141515612a0d57600080fd5b600080600080600060606001606088811515612a2557fe5b0401604051908082528060200260200182016040528015612a555781602001602082028038833980820191505090505b509050602095505b86861015612ab057612a6f8a8761337f565b809550819450505083850194508281606088811515612a8a57fe5b04815181101515612a9757fe5b9060200190602002018181525050606086019550612a5d565b606087811515612abc57fe5b0496505b6001871115612cd1576000600288811515612ad757fe5b06141515612b1d578060018803815181101515612af057fe5b906020019060200201518188815181101515612b0857fe5b90602001906020020181815250506001870196505b600095505b60018703861015612cbd578060018701815181101515612b3e57fe5b906020019060200201518187815181101515612b5657fe5b906020019060200201511415612b85578086815181101515612b7457fe5b906020019060200201519250612c89565b8060018701815181101515612b9657fe5b906020019060200201518187815181101515612bae57fe5b906020019060200201511015612c25578086815181101515612bcc57fe5b906020019060200201518160018801815181101515612be757fe5b906020019060200201516040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209250612c88565b8060018701815181101515612c3657fe5b906020019060200201518187815181101515612c4e57fe5b9060200190602002015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b5b8281600288811515612c9757fe5b04815181101515612ca457fe5b9060200190602002018181525050600286019550612b22565b600286811515612cc957fe5b049650612ac0565b806000815181101515612ce057fe5b90602001906020020151915081859850985050505050505050915091565b6000818311612d0d5782612d0f565b815b905092915050565b6000806001028560030154148015612d2f5750600084145b8015612d3b5750600083145b8015612d4a5750600060010282145b15612d585760019050612d98565b8383836040516020018084815260200183815260200182815260200193505050506040516020818303038152906040528051906020012085600301541490505b949350505050565b6000806000806000806000612db361371f565b612dbb61371f565b8e600001548260000181815250508e600101548260200181815250508d8260400181815250508c8260600181815250508b600001548160000181815250508b600101548160200181815250508a81604001818152505089816060018181525050612e258f8d6134f1565b9250612e318282613512565b9450612e3d8584612cfe565b94508483039350612e4e858b6135a6565b809b508196505050612e60848e6135a6565b809e508195505050828511151515612e7457fe5b828411151515612e8057fe5b898d858701010183141515612e9157fe5b84848e8c985098509850985050505050509650965096509692505050565b6000821480612ec15750600060010281145b15612ecb57612f06565b6000612ed88686866128f6565b9050600060096000838152602001908152602001600020905082816000018190555083816001018190555050505b5050505050565b600060606040805190810160405280600381526020017f3231320000000000000000000000000000000000000000000000000000000000815250905060006040805190810160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250823060025460016004811115612f9357fe5b8c8c8c8c604051602001808a805190602001908083835b602083101515612fcf5780518252602082019150602081019050602083039250612faa565b6001836020036101000a03801982511681845116808217855250505050505090500189805190602001908083835b6020831015156130225780518252602082019150602081019050602083039250612ffd565b6001836020036101000a0380198251168184511680821785525050505050509050018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187815260200186815260200185815260200184815260200183815260200182815260200199505050505050505050506040516020818303038152906040528051906020012090506130d681856135cb565b9250505095945050505050565b60008460020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600401548311151561313a57600080fd5b8281600401819055508181600301819055505050505050565b600060606040805190810160405280600381526020017f3237370000000000000000000000000000000000000000000000000000000000815250905060006040805190810160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152508230600254600260048111156131d957fe5b8d8d8d8d8d604051602001808b805190602001908083835b60208310151561321657805182526020820191506020810190506020830392506131f1565b6001836020036101000a0380198251168184511680821785525050505050509050018a805190602001908083835b6020831015156132695780518252602082019150602081019050602083039250613244565b6001836020036101000a0380198251168184511680821785525050505050509050018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140188815260200187815260200186815260200185815260200184815260200183815260200182805190602001908083835b60208310151561332157805182526020820191506020810190506020830392506132fc565b6001836020036101000a0380198251168184511680821785525050505050509050019a505050505050505050505060405160208183030381529060405280519060200120905061337181856135cb565b925050509695505050505050565b60008060008060008060008789511115156133a8578060008090509650965050505050506134ea565b878901519450602088018901519350604088018901519150848483604051602001808481526020018381526020018281526020019350505050604051602081830303815290604052805190602001209050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1f62946836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561348857600080fd5b505afa15801561349c573d6000803e3d6000fd5b505050506040513d60208110156134b257600080fd5b8101908080519060200190929190505050925060008314806134d45750828511155b156134de57600093505b80849650965050505050505b9250929050565b60008160010154836001015483600001548560000154010303905092915050565b600080600080600061352c876040015188606001516136de565b9350613540866040015187606001516136de565b925083831015151561355157600080fd5b8660400151841015151561356157fe5b8560400151831015151561357157fe5b83830391506135848288600001516136de565b90506135948188602001516135a6565b50809150508094505050505092915050565b6000808284116135bb576000848191506135c0565b828403835b915091509250929050565b6000604182511415156135dd57600080fd5b60008060006020850151925060408501519150606085015160001a9050601b8160ff16101561360d57601b810190505b601b8160ff1614806136225750601c8160ff16145b151561362d57600080fd5b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561368a573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156136d257600080fd5b83935050505092915050565b600080828401905083811015613714577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613716565b805b91505092915050565b60806040519081016040528060008152602001600081526020016000815260200160008152509056fea165627a7a72305820656cdf73dc8613cacb88247f0856941db1d3229c66937c3f479c36811c177d7b0029a165627a7a723058209fd85d8068ba302a5f56a341d281a1c492be75a6082ba1d070d1bfc08a446e910029",
-            "metadata": "{\"compiler\":{\"version\":\"0.5.4+commit.9549d8ff\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"token_to_token_networks\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"settlement_timeout_max\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"deprecation_executor\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"chain_id\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_token_address\",\"type\":\"address\"}],\"name\":\"createERC20TokenNetwork\",\"outputs\":[{\"name\":\"token_network_address\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"contract_address\",\"type\":\"address\"}],\"name\":\"contractExists\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"contract_version\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"token_network_created\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"settlement_timeout_min\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"secret_registry_address\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_secret_registry_address\",\"type\":\"address\"},{\"name\":\"_chain_id\",\"type\":\"uint256\"},{\"name\":\"_settlement_timeout_min\",\"type\":\"uint256\"},{\"name\":\"_settlement_timeout_max\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"token_address\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"token_network_address\",\"type\":\"address\"}],\"name\":\"TokenNetworkCreated\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"contractExists(address)\":{\"params\":{\"contract_address\":\"The address to check whether a contract is deployed or not\"},\"return\":\"True if a contract exists, false otherwise\"},\"createERC20TokenNetwork(address)\":{\"params\":{\"_token_address\":\"Ethereum address of an already deployed token, to be used in the new TokenNetwork contract.\"}}},\"title\":\"TokenNetworkRegistry\"},\"userdoc\":{\"methods\":{\"contractExists(address)\":{\"notice\":\"Check if a contract exists\"},\"createERC20TokenNetwork(address)\":{\"notice\":\"Deploy a new TokenNetwork contract for the Token deployed at `_token_address`.\"}},\"notice\":\"The TokenNetwork Registry deploys new TokenNetwork contracts for the Raiden Network protocol.\"}},\"settings\":{\"compilationTarget\":{\"contracts/raiden/TokenNetworkRegistry.sol\":\"TokenNetworkRegistry\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":.=.\",\":lib=contracts/lib\",\":raiden=contracts/raiden\",\":services=contracts/services\",\":test=contracts/test\"]},\"sources\":{\"contracts/lib/ECVerify.sol\":{\"keccak256\":\"0x8bb402baa478eb53252d77b63982e12685adda290cf4dfa1d8f510284f8df3e9\",\"urls\":[\"bzzr://474c3db1bb54bb831c32eb2ab67a0e870489994bd4d4b8a8fa24b54935211d43\"]},\"contracts/raiden/SecretRegistry.sol\":{\"keccak256\":\"0x7bb84c5560050622a736c57af231a2cd3172eb27771bffb1114ef75ad27baf71\",\"urls\":[\"bzzr://544c37e9b500d65320980e74e30d0ab4f75a8ce28f76396d7bd5422f51bdef3d\"]},\"contracts/raiden/Token.sol\":{\"keccak256\":\"0x41b40819d7f6714550c742f48ce46daeb97255c08bc56e83bb9fde4fbe14c3b4\",\"urls\":[\"bzzr://a20e2bea336fb01584cf4dc80e77bb8db3c33666f77f840fd58559116849ae4b\"]},\"contracts/raiden/TokenNetwork.sol\":{\"keccak256\":\"0xd6a815ea4cc35ca8fbf9e64cae2d51bcad170cd242c3f6681d9c887d09e2b595\",\"urls\":[\"bzzr://61b2069b4a3ac87f37cf9f80db287817235e17f3833bd3dacbb95ef43353e5ce\"]},\"contracts/raiden/TokenNetworkRegistry.sol\":{\"keccak256\":\"0x78121885231ae5a122577474719255f4e21480dfbd850351840523b7edcc96bf\",\"urls\":[\"bzzr://17977f03acc55fc85bd28555e49544a96904004f38dd76a211cac77a0d69f02c\"]},\"contracts/raiden/Utils.sol\":{\"keccak256\":\"0x44a5b458227196e3633ec4534fe9d31009171a5230a67ecd5ce5545a796d3959\",\"urls\":[\"bzzr://bc5a8b1ca4d4845fca2d59e9587b23503be8f0d7613280d0311a5f4de8d17099\"]}},\"version\":1}"
+            "bin": "6080604052600060065534801561001557600080fd5b5060405160a0806144b5833981018060405260a081101561003557600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505060008411151561007d57600080fd5b60008311151561008c57600080fd5b60008211151561009b57600080fd5b82821115156100a957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156100e557600080fd5b6100fd856101be640100000000026401000000009004565b151561010857600080fd5b60008111151561011757600080fd5b846000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360018190555082600281905550816003819055508060048190555033600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050506101d1565b600080823b905060008111915050919050565b6142d5806101e06000396000f3fe608060405234801561001057600080fd5b50600436106100c6576000357c0100000000000000000000000000000000000000000000000000000000900480637709bc781161008e5780637709bc7814610259578063b0228f1e146102b5578063b32c65c8146102d3578063b61c408314610356578063b8378f7514610374578063d0ad4bec14610392576100c6565b80630fabd9e7146100cb578063224df42f1461014f57806323aa81741461016d5780633af973b1146101b75780634cf71a04146101d5575b600080fd5b61010d600480360360208110156100e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506103dc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61015761040f565b6040518082815260200191505060405180910390f35b610175610415565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101bf61043b565b6040518082815260200191505060405180910390f35b610217600480360360208110156101eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610441565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61029b6004803603602081101561026f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061070c565b604051808215151515815260200191505060405180910390f35b6102bd61071f565b6040518082815260200191505060405180910390f35b6102db610725565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561031b578082015181840152602081019050610300565b50505050905090810190601f1680156103485780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61035e61075e565b6040518082815260200191505060405180910390f35b61037c610764565b6040518082815260200191505060405180910390f35b61039a61076a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015481565b600060045460065410151561045557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156104ef57600080fd5b6001600654016006819055506000826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600154600254600354600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516105589061078f565b808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019650505050505050604051809103906000f080158015610625573d6000803e3d6000fd5b50905080915081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff11a7558a113d9627989c5edf26cbd19143b7375248e621c8e30ac9e0847dc3f60405160405180910390a381915050919050565b600080823b905060008111915050919050565b60045481565b6040805190810160405280600581526020017f302e382e3000000000000000000000000000000000000000000000000000000081525081565b60065481565b60025481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b613b0d8061079d8339019056fe60806040526000600660146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405160c08062003b0d833981018060405260c08110156200004e57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515620000ce57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156200010b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156200014857600080fd5b6000841115156200015857600080fd5b6000831115156200016857600080fd5b82821115156200017757600080fd5b620001918662000376640100000000026401000000009004565b15156200019d57600080fd5b620001b78562000376640100000000026401000000009004565b1515620001c357600080fd5b856000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600281905550826003819055508160048190555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015620002df57600080fd5b505afa158015620002f4573d6000803e3d6000fd5b505050506040513d60208110156200030b57600080fd5b81019080805190602001909291905050501115156200032957600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505062000389565b600080823b905060008111915050919050565b61377480620003996000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637c4734f411610116578063b8378f75116100b4578063ee4516d91161008e578063ee4516d914610aa7578063fadc554b14610b57578063fc0c546a14610c8e578063fe49ba1c14610cd8576101e1565b8063b8378f751461092f578063db45479b1461094d578063e5949b5d14610a50576101e1565b8063938bcd67116100f0578063938bcd67146107675780639cadb159146107df578063b32c65c81461088a578063b7506d701461090d576101e1565b80637c4734f4146105d5578063838d6e051461064d57806387234237146106e4576101e1565b80634845be761161018357806363ea01431161015d57806363ea0143146104c5578063679b37631461053d57806371e759921461055b5780637709bc7814610579576101e1565b80634845be7614610447578063524bef8a146104655780635d6e441b146104a7576101e1565b8063224df42f116101bf578063224df42f1461037757806323aa81741461039557806324d73a93146103df5780633af973b114610429576101e1565b806303d9d253146101e65780630a798f24146102eb5780630fcc0c281461036d575b600080fd5b6102e9600480360360808110156101fc57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561026357600080fd5b82018360208201111561027557600080fd5b8035906020019184600183028401116401000000008311171561029757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610d5a565b005b6103576004803603606081101561030157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611128565b6040518082815260200191505060405180910390f35b6103756113d5565b005b61037f611470565b6040518082815260200191505060405180910390f35b61039d611476565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e761149c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104316114c2565b6040518082815260200191505060405180910390f35b61044f6114c8565b6040518082815260200191505060405180910390f35b6104916004803603602081101561047b57600080fd5b81019080803590602001909291905050506114d5565b6040518082815260200191505060405180910390f35b6104af6114ed565b6040518082815260200191505060405180910390f35b61053b600480360360808110156104db57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114f9565b005b610545611951565b6040518082815260200191505060405180910390f35b610563611957565b6040518082815260200191505060405180910390f35b6105bb6004803603602081101561058f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061197b565b604051808215151515815260200191505060405180910390f35b610637600480360360408110156105eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061198e565b6040518082815260200191505060405180910390f35b6106b96004803603606081101561066357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bd0565b604051808381526020018260048111156106cf57fe5b60ff1681526020019250505060405180910390f35b6106ec611cc3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561072c578082015181840152602081019050610711565b50505050905090810190601f1680156107595780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6107c96004803603604081101561077d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cfc565b6040518082815260200191505060405180910390f35b61088860048036036101208110156107f657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611ddb565b005b6108926122ff565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108d25780820151818401526020810190506108b7565b50505050905090810190601f1680156108ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610915612338565b604051808215151515815260200191505060405180910390f35b61093761234b565b6040518082815260200191505060405180910390f35b610a4e600480360360c081101561096357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001906401000000008111156109c857600080fd5b8201836020820111156109da57600080fd5b803590602001918460018302840111640100000000831117156109fc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612351565b005b610a7c60048036036020811015610a6657600080fd5b810190808035906020019092919050505061250d565b60405180838152602001826004811115610a9257fe5b60ff1681526020019250505060405180910390f35b610b1360048036036060811015610abd57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061253e565b604051808881526020018781526020018615151515815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b610c8c6004803603610100811015610b6e57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610bf357600080fd5b820183602082011115610c0557600080fd5b80359060200191846001830284011164010000000083111715610c2757600080fd5b909192939192939080359060200190640100000000811115610c4857600080fd5b820183602082011115610c5a57600080fd5b80359060200191846001830284011164010000000083111715610c7c57600080fd5b9091929391929390505050612613565b005b610c966128d1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d4460048036036060811015610cee57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f6565b6040518082815260200191505060405180910390f35b610d648383611cfc565b8414151515610d7257600080fd5b60006004811115610d7f57fe5b6007600086815260200190815260200160002060010160009054906101000a900460ff166004811115610dae57fe5b141515610dba57600080fd5b60008151111515610dca57600080fd5b6000806000806000610ddb866129e9565b8094508195505050610dee89888a6128f6565b9450600060096000878152602001908152602001600020905080600101549250848160000154141515610e2057600080fd5b600083111515610e2f57600080fd5b610e398484612cfe565b9350838303915060096000878152602001908152602001600020600080820160009055600182016000905550508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168b7f8c03cf01b3d4e6068cc494e6fe02aa9e3d4af069d37c32ecc3b241af5c37e6c088888760405180848152602001838152602001828152602001935050505060405180910390a46000841115610ff0576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b505050506040513d6020811015610fd357600080fd5b81019080805190602001909291905050501515610fef57600080fd5b5b6000821115611104576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110bd57600080fd5b505af11580156110d1573d6000803e3d6000fd5b505050506040513d60208110156110e757600080fd5b8101908080519060200190929190505050151561110357600080fd5b5b81831015151561111057fe5b83831015151561111c57fe5b50505050505050505050565b6000801515600660149054906101000a900460ff16151514151561114b57600080fd5b81600354811015151561115d57600080fd5b600454811115151561116e57600080fd5b600080680d8d726b7177a800006000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561123557600080fd5b505afa158015611249573d6000803e3d6000fd5b505050506040513d602081101561125f57600080fd5b810190808051906020019092919050505010151561127c57600080fd5b6001600560008282540192505081905550600554905061129c878761198e565b9150600060086000848152602001908152602001600020541415156112c057600080fd5b8060086000848152602001908152602001600020819055506000600760008381526020019081526020016000209050600081600001541415156112ff57fe5b6000600481111561130c57fe5b8160010160009054906101000a900460ff16600481111561132957fe5b14151561133257fe5b85816000018190555060018160010160006101000a81548160ff0219169083600481111561135c57fe5b02179055508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16837f669a4b0ac0b9994c0f82ed4dbe07bb421fe74e5951725af4f139c7443ebf049d896040518082815260200191505060405180910390a4819450505050509392505050565b60001515600660149054906101000a900460ff1615151415156113f757600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145357600080fd5b6001600660146101000a81548160ff021916908315150217905550565b60045481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b680d8d726b7177a8000081565b60086020528060005260406000206000915090505481565b67010a741a4627800081565b60001515600660149054906101000a900460ff16151514151561151b57600080fd5b836001600481111561152957fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff16600481111561155857fe5b14151561156457600080fd5b61156e8483611cfc565b8514151561157b57600080fd5b60008311151561158a57600080fd5b67010a741a4627800083111515156115a157600080fd5b600080600060076000898152602001908152602001600020905060008160020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260020160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905081600001548803945060008511151561165d57600080fd5b87851115151561166c57600080fd5b878583600001540114151561167d57fe5b680d8d726b7177a80000856000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561174257600080fd5b505afa158015611756573d6000803e3d6000fd5b505050506040513d602081101561176c57600080fd5b8101908080519060200190929190505050011115151561178b57600080fd5b87826000018190555080600001548260000154019350816000015484101515156117b457600080fd5b8873ffffffffffffffffffffffffffffffffffffffff168a7f2b55547a3b586ab51f65ee9ce4927fa6d25191388299988e89e059a02f9dd44584600001546040518082815260200191505060405180910390a36000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156118ff57600080fd5b505af1158015611913573d6000803e3d6000fd5b505050506040513d602081101561192957600080fd5b8101908080519060200190929190505050151561194557600080fd5b50505050505050505050565b60055481565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b600080823b905060008111915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156119cb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611a0757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611a4257600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161015611b22578282604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051602081830303815290604052805190602001209050611bca565b8183604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040516020818303038152906040528051906020012090505b92915050565b600080600080600060076000898152602001908152602001600020905060008160010160009054906101000a900460ff16905060006004811115611c1057fe5b816004811115611c1c57fe5b148015611c295750600089115b8015611c3757506005548911155b15611cad5760039050611c4b8989896128f6565b93506000600960008681526020019081526020016000209050611c6f8a898b6128f6565b9350600060096000868152602001908152602001600020905060008260010154148015611ca0575060008160010154145b15611caa57600492505b50505b8160000154819550955050505050935093915050565b6040805190810160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611d3957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611d7557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611db057600080fd5b6000611dbc848461198e565b9050600860008281526020019081526020016000205491505092915050565b611de58885611cfc565b89141515611df257600080fd5b6000611dfe898661198e565b90506000600760008c8152602001908152602001600020905060026004811115611e2457fe5b8160010160009054906101000a900460ff166004811115611e4157fe5b141515611e4d57600080fd5b438160000154101515611e5f57600080fd5b60008160020160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611ef5828c8c8c612d17565b1515611f0057600080fd5b611f0c81888888612d17565b1515611f1757600080fd5b611f25828c8c848b8b612da0565b809950819d50829a50839e50505050508260020160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549060ff02191690556003820160009055600482016000905550508260020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549060ff0219169055600382016000905560048201600090555050600760008e81526020019081526020016000206000808201600090556001820160006101000a81549060ff02191690555050600860008581526020019081526020016000206000905561207b8d8d8a8d8d612eaf565b6120888d898e8989612eaf565b8c7f0e239ef20c651bd0bc45e6f6a5fd46252d77d39d6602103e347add00cabdb0b48c89604051808381526020018281526020019250505060405180910390a260008b11156121dc576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8d8d6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561219557600080fd5b505af11580156121a9573d6000803e3d6000fd5b505050506040513d60208110156121bf57600080fd5b810190808051906020019092919050505015156121db57600080fd5b5b60008711156122f0576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156122a957600080fd5b505af11580156122bd573d6000803e3d6000fd5b505050506040513d60208110156122d357600080fd5b810190808051906020019092919050505015156122ef57600080fd5b5b50505050505050505050505050565b6040805190810160405280600581526020017f302e382e3000000000000000000000000000000000000000000000000000000081525081565b600660149054906101000a900460ff1681565b60035481565b856001600481111561235f57fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff16600481111561238e57fe5b14151561239a57600080fd5b6123a43387611cfc565b871415156123b157600080fd5b600080600760008a8152602001908152602001600020905060028160010160006101000a81548160ff021916908360048111156123ea57fe5b021790555060018160020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff02191690831515021790555043816000016000828254019250508190555060008611156124bd576124748988888888612f0d565b91508173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415156124b057600080fd5b6124bc8183888a6130e3565b5b853373ffffffffffffffffffffffffffffffffffffffff168a7f5fe3d4a343010393184843ef4873386b572e844e89f6b41c9f60f5ab912fbdfe60405160405180910390a4505050505050505050565b60076020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16905082565b6000806000806000806000806000600760008d815260200190815260200160002060020160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506125ac8c8c8c6128f6565b91506000600960008481526020019081526020016000209050816000015482600101548360020160009054906101000a900460ff16846003015485600401548560000154866001015499509950995099509950995099505050509397509397509397909450565b61261d8989611cfc565b8a14151561262a57600080fd5b6000600102871415151561263d57600080fd5b60008611151561264c57600080fd5b6000806000600760008e815260200190815260200160002090506002600481111561267357fe5b8160010160009054906101000a900460ff16600481111561269057fe5b14151561269c57600080fd5b438160000154101515156126af57600080fd5b6127458d8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613153565b92508273ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614151561278157600080fd5b6127d28d8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612f0d565b91508173ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614151561280e57600080fd5b60008160020160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060020160009054906101000a900460ff16151561287057600080fd5b61287c828e8c8e6130e3565b898d73ffffffffffffffffffffffffffffffffffffffff168f7f09bd10d8ee6f30d654401133d6eac60e091a0d8e13f54005754de9394c11fbd360405160405180910390a45050505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561293357600080fd5b838383604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140193505050506040516020818303038152906040528051906020012090509392505050565b6000806000835190506000606082811515612a0057fe5b06141515612a0d57600080fd5b600080600080600060606001606088811515612a2557fe5b0401604051908082528060200260200182016040528015612a555781602001602082028038833980820191505090505b509050602095505b86861015612ab057612a6f8a8761337f565b809550819450505083850194508281606088811515612a8a57fe5b04815181101515612a9757fe5b9060200190602002018181525050606086019550612a5d565b606087811515612abc57fe5b0496505b6001871115612cd1576000600288811515612ad757fe5b06141515612b1d578060018803815181101515612af057fe5b906020019060200201518188815181101515612b0857fe5b90602001906020020181815250506001870196505b600095505b60018703861015612cbd578060018701815181101515612b3e57fe5b906020019060200201518187815181101515612b5657fe5b906020019060200201511415612b85578086815181101515612b7457fe5b906020019060200201519250612c89565b8060018701815181101515612b9657fe5b906020019060200201518187815181101515612bae57fe5b906020019060200201511015612c25578086815181101515612bcc57fe5b906020019060200201518160018801815181101515612be757fe5b906020019060200201516040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209250612c88565b8060018701815181101515612c3657fe5b906020019060200201518187815181101515612c4e57fe5b9060200190602002015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b5b8281600288811515612c9757fe5b04815181101515612ca457fe5b9060200190602002018181525050600286019550612b22565b600286811515612cc957fe5b049650612ac0565b806000815181101515612ce057fe5b90602001906020020151915081859850985050505050505050915091565b6000818311612d0d5782612d0f565b815b905092915050565b6000806001028560030154148015612d2f5750600084145b8015612d3b5750600083145b8015612d4a5750600060010282145b15612d585760019050612d98565b8383836040516020018084815260200183815260200182815260200193505050506040516020818303038152906040528051906020012085600301541490505b949350505050565b6000806000806000806000612db361371f565b612dbb61371f565b8e600001548260000181815250508e600101548260200181815250508d8260400181815250508c8260600181815250508b600001548160000181815250508b600101548160200181815250508a81604001818152505089816060018181525050612e258f8d6134f1565b9250612e318282613512565b9450612e3d8584612cfe565b94508483039350612e4e858b6135a6565b809b508196505050612e60848e6135a6565b809e508195505050828511151515612e7457fe5b828411151515612e8057fe5b898d858701010183141515612e9157fe5b84848e8c985098509850985050505050509650965096509692505050565b6000821480612ec15750600060010281145b15612ecb57612f06565b6000612ed88686866128f6565b9050600060096000838152602001908152602001600020905082816000018190555083816001018190555050505b5050505050565b600060606040805190810160405280600381526020017f3231320000000000000000000000000000000000000000000000000000000000815250905060006040805190810160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250823060025460016004811115612f9357fe5b8c8c8c8c604051602001808a805190602001908083835b602083101515612fcf5780518252602082019150602081019050602083039250612faa565b6001836020036101000a03801982511681845116808217855250505050505090500189805190602001908083835b6020831015156130225780518252602082019150602081019050602083039250612ffd565b6001836020036101000a0380198251168184511680821785525050505050509050018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187815260200186815260200185815260200184815260200183815260200182815260200199505050505050505050506040516020818303038152906040528051906020012090506130d681856135cb565b9250505095945050505050565b60008460020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600401548311151561313a57600080fd5b8281600401819055508181600301819055505050505050565b600060606040805190810160405280600381526020017f3237370000000000000000000000000000000000000000000000000000000000815250905060006040805190810160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152508230600254600260048111156131d957fe5b8d8d8d8d8d604051602001808b805190602001908083835b60208310151561321657805182526020820191506020810190506020830392506131f1565b6001836020036101000a0380198251168184511680821785525050505050509050018a805190602001908083835b6020831015156132695780518252602082019150602081019050602083039250613244565b6001836020036101000a0380198251168184511680821785525050505050509050018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140188815260200187815260200186815260200185815260200184815260200183815260200182805190602001908083835b60208310151561332157805182526020820191506020810190506020830392506132fc565b6001836020036101000a0380198251168184511680821785525050505050509050019a505050505050505050505060405160208183030381529060405280519060200120905061337181856135cb565b925050509695505050505050565b60008060008060008060008789511115156133a8578060008090509650965050505050506134ea565b878901519450602088018901519350604088018901519150848483604051602001808481526020018381526020018281526020019350505050604051602081830303815290604052805190602001209050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1f62946836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561348857600080fd5b505afa15801561349c573d6000803e3d6000fd5b505050506040513d60208110156134b257600080fd5b8101908080519060200190929190505050925060008314806134d45750828511155b156134de57600093505b80849650965050505050505b9250929050565b60008160010154836001015483600001548560000154010303905092915050565b600080600080600061352c876040015188606001516136de565b9350613540866040015187606001516136de565b925083831015151561355157600080fd5b8660400151841015151561356157fe5b8560400151831015151561357157fe5b83830391506135848288600001516136de565b90506135948188602001516135a6565b50809150508094505050505092915050565b6000808284116135bb576000848191506135c0565b828403835b915091509250929050565b6000604182511415156135dd57600080fd5b60008060006020850151925060408501519150606085015160001a9050601b8160ff16101561360d57601b810190505b601b8160ff1614806136225750601c8160ff16145b151561362d57600080fd5b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561368a573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156136d257600080fd5b83935050505092915050565b600080828401905083811015613714577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613716565b805b91505092915050565b60806040519081016040528060008152602001600081526020016000815260200160008152509056fea165627a7a72305820656cdf73dc8613cacb88247f0856941db1d3229c66937c3f479c36811c177d7b0029a165627a7a72305820dee22cf0a4014f961cb15a6b0802efe3f26c5fbf322f88a509f2c184627647e30029",
+            "bin-runtime": "608060405234801561001057600080fd5b50600436106100c6576000357c0100000000000000000000000000000000000000000000000000000000900480637709bc781161008e5780637709bc7814610259578063b0228f1e146102b5578063b32c65c8146102d3578063b61c408314610356578063b8378f7514610374578063d0ad4bec14610392576100c6565b80630fabd9e7146100cb578063224df42f1461014f57806323aa81741461016d5780633af973b1146101b75780634cf71a04146101d5575b600080fd5b61010d600480360360208110156100e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506103dc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61015761040f565b6040518082815260200191505060405180910390f35b610175610415565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101bf61043b565b6040518082815260200191505060405180910390f35b610217600480360360208110156101eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610441565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61029b6004803603602081101561026f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061070c565b604051808215151515815260200191505060405180910390f35b6102bd61071f565b6040518082815260200191505060405180910390f35b6102db610725565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561031b578082015181840152602081019050610300565b50505050905090810190601f1680156103485780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61035e61075e565b6040518082815260200191505060405180910390f35b61037c610764565b6040518082815260200191505060405180910390f35b61039a61076a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015481565b600060045460065410151561045557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156104ef57600080fd5b6001600654016006819055506000826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600154600254600354600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516105589061078f565b808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019650505050505050604051809103906000f080158015610625573d6000803e3d6000fd5b50905080915081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff11a7558a113d9627989c5edf26cbd19143b7375248e621c8e30ac9e0847dc3f60405160405180910390a381915050919050565b600080823b905060008111915050919050565b60045481565b6040805190810160405280600581526020017f302e382e3000000000000000000000000000000000000000000000000000000081525081565b60065481565b60025481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b613b0d8061079d8339019056fe60806040526000600660146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405160c08062003b0d833981018060405260c08110156200004e57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515620000ce57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156200010b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156200014857600080fd5b6000841115156200015857600080fd5b6000831115156200016857600080fd5b82821115156200017757600080fd5b620001918662000376640100000000026401000000009004565b15156200019d57600080fd5b620001b78562000376640100000000026401000000009004565b1515620001c357600080fd5b856000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600281905550826003819055508160048190555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015620002df57600080fd5b505afa158015620002f4573d6000803e3d6000fd5b505050506040513d60208110156200030b57600080fd5b81019080805190602001909291905050501115156200032957600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505062000389565b600080823b905060008111915050919050565b61377480620003996000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637c4734f411610116578063b8378f75116100b4578063ee4516d91161008e578063ee4516d914610aa7578063fadc554b14610b57578063fc0c546a14610c8e578063fe49ba1c14610cd8576101e1565b8063b8378f751461092f578063db45479b1461094d578063e5949b5d14610a50576101e1565b8063938bcd67116100f0578063938bcd67146107675780639cadb159146107df578063b32c65c81461088a578063b7506d701461090d576101e1565b80637c4734f4146105d5578063838d6e051461064d57806387234237146106e4576101e1565b80634845be761161018357806363ea01431161015d57806363ea0143146104c5578063679b37631461053d57806371e759921461055b5780637709bc7814610579576101e1565b80634845be7614610447578063524bef8a146104655780635d6e441b146104a7576101e1565b8063224df42f116101bf578063224df42f1461037757806323aa81741461039557806324d73a93146103df5780633af973b114610429576101e1565b806303d9d253146101e65780630a798f24146102eb5780630fcc0c281461036d575b600080fd5b6102e9600480360360808110156101fc57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561026357600080fd5b82018360208201111561027557600080fd5b8035906020019184600183028401116401000000008311171561029757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610d5a565b005b6103576004803603606081101561030157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611128565b6040518082815260200191505060405180910390f35b6103756113d5565b005b61037f611470565b6040518082815260200191505060405180910390f35b61039d611476565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e761149c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104316114c2565b6040518082815260200191505060405180910390f35b61044f6114c8565b6040518082815260200191505060405180910390f35b6104916004803603602081101561047b57600080fd5b81019080803590602001909291905050506114d5565b6040518082815260200191505060405180910390f35b6104af6114ed565b6040518082815260200191505060405180910390f35b61053b600480360360808110156104db57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114f9565b005b610545611951565b6040518082815260200191505060405180910390f35b610563611957565b6040518082815260200191505060405180910390f35b6105bb6004803603602081101561058f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061197b565b604051808215151515815260200191505060405180910390f35b610637600480360360408110156105eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061198e565b6040518082815260200191505060405180910390f35b6106b96004803603606081101561066357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bd0565b604051808381526020018260048111156106cf57fe5b60ff1681526020019250505060405180910390f35b6106ec611cc3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561072c578082015181840152602081019050610711565b50505050905090810190601f1680156107595780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6107c96004803603604081101561077d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cfc565b6040518082815260200191505060405180910390f35b61088860048036036101208110156107f657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611ddb565b005b6108926122ff565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108d25780820151818401526020810190506108b7565b50505050905090810190601f1680156108ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610915612338565b604051808215151515815260200191505060405180910390f35b61093761234b565b6040518082815260200191505060405180910390f35b610a4e600480360360c081101561096357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001906401000000008111156109c857600080fd5b8201836020820111156109da57600080fd5b803590602001918460018302840111640100000000831117156109fc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612351565b005b610a7c60048036036020811015610a6657600080fd5b810190808035906020019092919050505061250d565b60405180838152602001826004811115610a9257fe5b60ff1681526020019250505060405180910390f35b610b1360048036036060811015610abd57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061253e565b604051808881526020018781526020018615151515815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b610c8c6004803603610100811015610b6e57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610bf357600080fd5b820183602082011115610c0557600080fd5b80359060200191846001830284011164010000000083111715610c2757600080fd5b909192939192939080359060200190640100000000811115610c4857600080fd5b820183602082011115610c5a57600080fd5b80359060200191846001830284011164010000000083111715610c7c57600080fd5b9091929391929390505050612613565b005b610c966128d1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d4460048036036060811015610cee57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f6565b6040518082815260200191505060405180910390f35b610d648383611cfc565b8414151515610d7257600080fd5b60006004811115610d7f57fe5b6007600086815260200190815260200160002060010160009054906101000a900460ff166004811115610dae57fe5b141515610dba57600080fd5b60008151111515610dca57600080fd5b6000806000806000610ddb866129e9565b8094508195505050610dee89888a6128f6565b9450600060096000878152602001908152602001600020905080600101549250848160000154141515610e2057600080fd5b600083111515610e2f57600080fd5b610e398484612cfe565b9350838303915060096000878152602001908152602001600020600080820160009055600182016000905550508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168b7f8c03cf01b3d4e6068cc494e6fe02aa9e3d4af069d37c32ecc3b241af5c37e6c088888760405180848152602001838152602001828152602001935050505060405180910390a46000841115610ff0576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b505050506040513d6020811015610fd357600080fd5b81019080805190602001909291905050501515610fef57600080fd5b5b6000821115611104576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110bd57600080fd5b505af11580156110d1573d6000803e3d6000fd5b505050506040513d60208110156110e757600080fd5b8101908080519060200190929190505050151561110357600080fd5b5b81831015151561111057fe5b83831015151561111c57fe5b50505050505050505050565b6000801515600660149054906101000a900460ff16151514151561114b57600080fd5b81600354811015151561115d57600080fd5b600454811115151561116e57600080fd5b600080680d8d726b7177a800006000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561123557600080fd5b505afa158015611249573d6000803e3d6000fd5b505050506040513d602081101561125f57600080fd5b810190808051906020019092919050505010151561127c57600080fd5b6001600560008282540192505081905550600554905061129c878761198e565b9150600060086000848152602001908152602001600020541415156112c057600080fd5b8060086000848152602001908152602001600020819055506000600760008381526020019081526020016000209050600081600001541415156112ff57fe5b6000600481111561130c57fe5b8160010160009054906101000a900460ff16600481111561132957fe5b14151561133257fe5b85816000018190555060018160010160006101000a81548160ff0219169083600481111561135c57fe5b02179055508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16837f669a4b0ac0b9994c0f82ed4dbe07bb421fe74e5951725af4f139c7443ebf049d896040518082815260200191505060405180910390a4819450505050509392505050565b60001515600660149054906101000a900460ff1615151415156113f757600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145357600080fd5b6001600660146101000a81548160ff021916908315150217905550565b60045481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b680d8d726b7177a8000081565b60086020528060005260406000206000915090505481565b67010a741a4627800081565b60001515600660149054906101000a900460ff16151514151561151b57600080fd5b836001600481111561152957fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff16600481111561155857fe5b14151561156457600080fd5b61156e8483611cfc565b8514151561157b57600080fd5b60008311151561158a57600080fd5b67010a741a4627800083111515156115a157600080fd5b600080600060076000898152602001908152602001600020905060008160020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260020160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905081600001548803945060008511151561165d57600080fd5b87851115151561166c57600080fd5b878583600001540114151561167d57fe5b680d8d726b7177a80000856000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561174257600080fd5b505afa158015611756573d6000803e3d6000fd5b505050506040513d602081101561176c57600080fd5b8101908080519060200190929190505050011115151561178b57600080fd5b87826000018190555080600001548260000154019350816000015484101515156117b457600080fd5b8873ffffffffffffffffffffffffffffffffffffffff168a7f2b55547a3b586ab51f65ee9ce4927fa6d25191388299988e89e059a02f9dd44584600001546040518082815260200191505060405180910390a36000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156118ff57600080fd5b505af1158015611913573d6000803e3d6000fd5b505050506040513d602081101561192957600080fd5b8101908080519060200190929190505050151561194557600080fd5b50505050505050505050565b60055481565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b600080823b905060008111915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156119cb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611a0757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611a4257600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161015611b22578282604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051602081830303815290604052805190602001209050611bca565b8183604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040516020818303038152906040528051906020012090505b92915050565b600080600080600060076000898152602001908152602001600020905060008160010160009054906101000a900460ff16905060006004811115611c1057fe5b816004811115611c1c57fe5b148015611c295750600089115b8015611c3757506005548911155b15611cad5760039050611c4b8989896128f6565b93506000600960008681526020019081526020016000209050611c6f8a898b6128f6565b9350600060096000868152602001908152602001600020905060008260010154148015611ca0575060008160010154145b15611caa57600492505b50505b8160000154819550955050505050935093915050565b6040805190810160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611d3957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611d7557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611db057600080fd5b6000611dbc848461198e565b9050600860008281526020019081526020016000205491505092915050565b611de58885611cfc565b89141515611df257600080fd5b6000611dfe898661198e565b90506000600760008c8152602001908152602001600020905060026004811115611e2457fe5b8160010160009054906101000a900460ff166004811115611e4157fe5b141515611e4d57600080fd5b438160000154101515611e5f57600080fd5b60008160020160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611ef5828c8c8c612d17565b1515611f0057600080fd5b611f0c81888888612d17565b1515611f1757600080fd5b611f25828c8c848b8b612da0565b809950819d50829a50839e50505050508260020160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549060ff02191690556003820160009055600482016000905550508260020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549060ff0219169055600382016000905560048201600090555050600760008e81526020019081526020016000206000808201600090556001820160006101000a81549060ff02191690555050600860008581526020019081526020016000206000905561207b8d8d8a8d8d612eaf565b6120888d898e8989612eaf565b8c7f0e239ef20c651bd0bc45e6f6a5fd46252d77d39d6602103e347add00cabdb0b48c89604051808381526020018281526020019250505060405180910390a260008b11156121dc576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8d8d6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561219557600080fd5b505af11580156121a9573d6000803e3d6000fd5b505050506040513d60208110156121bf57600080fd5b810190808051906020019092919050505015156121db57600080fd5b5b60008711156122f0576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156122a957600080fd5b505af11580156122bd573d6000803e3d6000fd5b505050506040513d60208110156122d357600080fd5b810190808051906020019092919050505015156122ef57600080fd5b5b50505050505050505050505050565b6040805190810160405280600581526020017f302e382e3000000000000000000000000000000000000000000000000000000081525081565b600660149054906101000a900460ff1681565b60035481565b856001600481111561235f57fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff16600481111561238e57fe5b14151561239a57600080fd5b6123a43387611cfc565b871415156123b157600080fd5b600080600760008a8152602001908152602001600020905060028160010160006101000a81548160ff021916908360048111156123ea57fe5b021790555060018160020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff02191690831515021790555043816000016000828254019250508190555060008611156124bd576124748988888888612f0d565b91508173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415156124b057600080fd5b6124bc8183888a6130e3565b5b853373ffffffffffffffffffffffffffffffffffffffff168a7f5fe3d4a343010393184843ef4873386b572e844e89f6b41c9f60f5ab912fbdfe60405160405180910390a4505050505050505050565b60076020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16905082565b6000806000806000806000806000600760008d815260200190815260200160002060020160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506125ac8c8c8c6128f6565b91506000600960008481526020019081526020016000209050816000015482600101548360020160009054906101000a900460ff16846003015485600401548560000154866001015499509950995099509950995099505050509397509397509397909450565b61261d8989611cfc565b8a14151561262a57600080fd5b6000600102871415151561263d57600080fd5b60008611151561264c57600080fd5b6000806000600760008e815260200190815260200160002090506002600481111561267357fe5b8160010160009054906101000a900460ff16600481111561269057fe5b14151561269c57600080fd5b438160000154101515156126af57600080fd5b6127458d8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613153565b92508273ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614151561278157600080fd5b6127d28d8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612f0d565b91508173ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614151561280e57600080fd5b60008160020160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060020160009054906101000a900460ff16151561287057600080fd5b61287c828e8c8e6130e3565b898d73ffffffffffffffffffffffffffffffffffffffff168f7f09bd10d8ee6f30d654401133d6eac60e091a0d8e13f54005754de9394c11fbd360405160405180910390a45050505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561293357600080fd5b838383604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140193505050506040516020818303038152906040528051906020012090509392505050565b6000806000835190506000606082811515612a0057fe5b06141515612a0d57600080fd5b600080600080600060606001606088811515612a2557fe5b0401604051908082528060200260200182016040528015612a555781602001602082028038833980820191505090505b509050602095505b86861015612ab057612a6f8a8761337f565b809550819450505083850194508281606088811515612a8a57fe5b04815181101515612a9757fe5b9060200190602002018181525050606086019550612a5d565b606087811515612abc57fe5b0496505b6001871115612cd1576000600288811515612ad757fe5b06141515612b1d578060018803815181101515612af057fe5b906020019060200201518188815181101515612b0857fe5b90602001906020020181815250506001870196505b600095505b60018703861015612cbd578060018701815181101515612b3e57fe5b906020019060200201518187815181101515612b5657fe5b906020019060200201511415612b85578086815181101515612b7457fe5b906020019060200201519250612c89565b8060018701815181101515612b9657fe5b906020019060200201518187815181101515612bae57fe5b906020019060200201511015612c25578086815181101515612bcc57fe5b906020019060200201518160018801815181101515612be757fe5b906020019060200201516040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209250612c88565b8060018701815181101515612c3657fe5b906020019060200201518187815181101515612c4e57fe5b9060200190602002015160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b5b8281600288811515612c9757fe5b04815181101515612ca457fe5b9060200190602002018181525050600286019550612b22565b600286811515612cc957fe5b049650612ac0565b806000815181101515612ce057fe5b90602001906020020151915081859850985050505050505050915091565b6000818311612d0d5782612d0f565b815b905092915050565b6000806001028560030154148015612d2f5750600084145b8015612d3b5750600083145b8015612d4a5750600060010282145b15612d585760019050612d98565b8383836040516020018084815260200183815260200182815260200193505050506040516020818303038152906040528051906020012085600301541490505b949350505050565b6000806000806000806000612db361371f565b612dbb61371f565b8e600001548260000181815250508e600101548260200181815250508d8260400181815250508c8260600181815250508b600001548160000181815250508b600101548160200181815250508a81604001818152505089816060018181525050612e258f8d6134f1565b9250612e318282613512565b9450612e3d8584612cfe565b94508483039350612e4e858b6135a6565b809b508196505050612e60848e6135a6565b809e508195505050828511151515612e7457fe5b828411151515612e8057fe5b898d858701010183141515612e9157fe5b84848e8c985098509850985050505050509650965096509692505050565b6000821480612ec15750600060010281145b15612ecb57612f06565b6000612ed88686866128f6565b9050600060096000838152602001908152602001600020905082816000018190555083816001018190555050505b5050505050565b600060606040805190810160405280600381526020017f3231320000000000000000000000000000000000000000000000000000000000815250905060006040805190810160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250823060025460016004811115612f9357fe5b8c8c8c8c604051602001808a805190602001908083835b602083101515612fcf5780518252602082019150602081019050602083039250612faa565b6001836020036101000a03801982511681845116808217855250505050505090500189805190602001908083835b6020831015156130225780518252602082019150602081019050602083039250612ffd565b6001836020036101000a0380198251168184511680821785525050505050509050018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187815260200186815260200185815260200184815260200183815260200182815260200199505050505050505050506040516020818303038152906040528051906020012090506130d681856135cb565b9250505095945050505050565b60008460020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600401548311151561313a57600080fd5b8281600401819055508181600301819055505050505050565b600060606040805190810160405280600381526020017f3237370000000000000000000000000000000000000000000000000000000000815250905060006040805190810160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152508230600254600260048111156131d957fe5b8d8d8d8d8d604051602001808b805190602001908083835b60208310151561321657805182526020820191506020810190506020830392506131f1565b6001836020036101000a0380198251168184511680821785525050505050509050018a805190602001908083835b6020831015156132695780518252602082019150602081019050602083039250613244565b6001836020036101000a0380198251168184511680821785525050505050509050018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140188815260200187815260200186815260200185815260200184815260200183815260200182805190602001908083835b60208310151561332157805182526020820191506020810190506020830392506132fc565b6001836020036101000a0380198251168184511680821785525050505050509050019a505050505050505050505060405160208183030381529060405280519060200120905061337181856135cb565b925050509695505050505050565b60008060008060008060008789511115156133a8578060008090509650965050505050506134ea565b878901519450602088018901519350604088018901519150848483604051602001808481526020018381526020018281526020019350505050604051602081830303815290604052805190602001209050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1f62946836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561348857600080fd5b505afa15801561349c573d6000803e3d6000fd5b505050506040513d60208110156134b257600080fd5b8101908080519060200190929190505050925060008314806134d45750828511155b156134de57600093505b80849650965050505050505b9250929050565b60008160010154836001015483600001548560000154010303905092915050565b600080600080600061352c876040015188606001516136de565b9350613540866040015187606001516136de565b925083831015151561355157600080fd5b8660400151841015151561356157fe5b8560400151831015151561357157fe5b83830391506135848288600001516136de565b90506135948188602001516135a6565b50809150508094505050505092915050565b6000808284116135bb576000848191506135c0565b828403835b915091509250929050565b6000604182511415156135dd57600080fd5b60008060006020850151925060408501519150606085015160001a9050601b8160ff16101561360d57601b810190505b601b8160ff1614806136225750601c8160ff16145b151561362d57600080fd5b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561368a573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156136d257600080fd5b83935050505092915050565b600080828401905083811015613714577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613716565b805b91505092915050565b60806040519081016040528060008152602001600081526020016000815260200160008152509056fea165627a7a72305820656cdf73dc8613cacb88247f0856941db1d3229c66937c3f479c36811c177d7b0029a165627a7a72305820dee22cf0a4014f961cb15a6b0802efe3f26c5fbf322f88a509f2c184627647e30029",
+            "metadata": "{\"compiler\":{\"version\":\"0.5.4+commit.9549d8ff\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"token_to_token_networks\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"settlement_timeout_max\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"deprecation_executor\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"chain_id\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_token_address\",\"type\":\"address\"}],\"name\":\"createERC20TokenNetwork\",\"outputs\":[{\"name\":\"token_network_address\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"contract_address\",\"type\":\"address\"}],\"name\":\"contractExists\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"max_token_networks\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"contract_version\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"token_network_created\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"settlement_timeout_min\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"secret_registry_address\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_secret_registry_address\",\"type\":\"address\"},{\"name\":\"_chain_id\",\"type\":\"uint256\"},{\"name\":\"_settlement_timeout_min\",\"type\":\"uint256\"},{\"name\":\"_settlement_timeout_max\",\"type\":\"uint256\"},{\"name\":\"_max_token_networks\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"token_address\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"token_network_address\",\"type\":\"address\"}],\"name\":\"TokenNetworkCreated\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"contractExists(address)\":{\"params\":{\"contract_address\":\"The address to check whether a contract is deployed or not\"},\"return\":\"True if a contract exists, false otherwise\"},\"createERC20TokenNetwork(address)\":{\"params\":{\"_token_address\":\"Ethereum address of an already deployed token, to be used in the new TokenNetwork contract.\"}}},\"title\":\"TokenNetworkRegistry\"},\"userdoc\":{\"methods\":{\"contractExists(address)\":{\"notice\":\"Check if a contract exists\"},\"createERC20TokenNetwork(address)\":{\"notice\":\"Deploy a new TokenNetwork contract for the Token deployed at `_token_address`.\"}},\"notice\":\"The TokenNetwork Registry deploys new TokenNetwork contracts for the Raiden Network protocol.\"}},\"settings\":{\"compilationTarget\":{\"contracts/raiden/TokenNetworkRegistry.sol\":\"TokenNetworkRegistry\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":.=.\",\":lib=contracts/lib\",\":raiden=contracts/raiden\",\":services=contracts/services\",\":test=contracts/test\"]},\"sources\":{\"contracts/lib/ECVerify.sol\":{\"keccak256\":\"0x8bb402baa478eb53252d77b63982e12685adda290cf4dfa1d8f510284f8df3e9\",\"urls\":[\"bzzr://474c3db1bb54bb831c32eb2ab67a0e870489994bd4d4b8a8fa24b54935211d43\"]},\"contracts/raiden/SecretRegistry.sol\":{\"keccak256\":\"0x7bb84c5560050622a736c57af231a2cd3172eb27771bffb1114ef75ad27baf71\",\"urls\":[\"bzzr://544c37e9b500d65320980e74e30d0ab4f75a8ce28f76396d7bd5422f51bdef3d\"]},\"contracts/raiden/Token.sol\":{\"keccak256\":\"0x41b40819d7f6714550c742f48ce46daeb97255c08bc56e83bb9fde4fbe14c3b4\",\"urls\":[\"bzzr://a20e2bea336fb01584cf4dc80e77bb8db3c33666f77f840fd58559116849ae4b\"]},\"contracts/raiden/TokenNetwork.sol\":{\"keccak256\":\"0xd6a815ea4cc35ca8fbf9e64cae2d51bcad170cd242c3f6681d9c887d09e2b595\",\"urls\":[\"bzzr://61b2069b4a3ac87f37cf9f80db287817235e17f3833bd3dacbb95ef43353e5ce\"]},\"contracts/raiden/TokenNetworkRegistry.sol\":{\"keccak256\":\"0x67cec4174f629b5c4c046b6a78cc1ac83bf322a4ea0bd0be2f447a34cbd33b59\",\"urls\":[\"bzzr://de30e2d5cda539efc15b47c3f26899a043998453b05c9a58f6c32609f744947a\"]},\"contracts/raiden/Utils.sol\":{\"keccak256\":\"0x44a5b458227196e3633ec4534fe9d31009171a5230a67ecd5ce5545a796d3959\",\"urls\":[\"bzzr://bc5a8b1ca4d4845fca2d59e9587b23503be8f0d7613280d0311a5f4de8d17099\"]}},\"version\":1}"
         },
         "TokenNetworkSignatureTest": {
             "abi": [
@@ -6373,11 +6391,11 @@
         "Token.sol": "1a73cc2b96ad17dca1b5ba83d943e4576764862c56037905daea0544277d4cd4",
         "TokenNetwork.sol": "73ab66e826789ff6a18b98ea92f01619c15e97b3f4b03d93fb2754fff058f4f3",
         "TokenNetworkInternalsTest.sol": "7cd4d054af428de7a1c157f42cd44402e3e1e0bea706ede87d722fd4cb4fbf7c",
-        "TokenNetworkRegistry.sol": "0d75d1fcaaafe67080fd47cbf64c5165c986cf5c7c32e18fd9033b0e27546a22",
+        "TokenNetworkRegistry.sol": "36dff9d9d0a027e8eecc989c4e24b2bb2727aea59e02e01755e4f16b6d018ccf",
         "UDCTransfer.sol": "99ba67c9fdb62ab01998ca9ac6aed2be40e2e86eba021f35f6a15621cc49bfbf",
         "UserDeposit.sol": "e51bd069efc655631c82f14b4f4b68361729d21d02b4d2da8c1244a1e7349ca6",
         "Utils.sol": "68ef4cb42233e9ec38d7558112eb554114d4c4d56b78d00071110d14a565d15c"
     },
     "contracts_version": "0.8.0",
-    "overall_checksum": "b444cb63de8963c1ed77e96e86d55061044c95882e0d9459a1579cf5faef3486"
+    "overall_checksum": "28df258db7a76c179d1eee90657733bba7178b08559702be2ef935957fd7d6c9"
 }
\ No newline at end of file
diff --git a/raiden_contracts/data/source/raiden/TokenNetworkRegistry.sol b/raiden_contracts/data/source/raiden/TokenNetworkRegistry.sol
index 75c14f9..ca1c414 100644
--- a/raiden_contracts/data/source/raiden/TokenNetworkRegistry.sol
+++ b/raiden_contracts/data/source/raiden/TokenNetworkRegistry.sol
@@ -15,10 +15,11 @@ contract TokenNetworkRegistry is Utils {
     uint256 public chain_id;
     uint256 public settlement_timeout_min;
     uint256 public settlement_timeout_max;
+    uint256 public max_token_networks;
 
     // Only for the limited Red Eyes release
     address public deprecation_executor;
-    bool public token_network_created = false;
+    uint256 public token_network_created = 0;
 
     // Token address => TokenNetwork address
     mapping(address => address) public token_to_token_networks;
@@ -26,7 +27,7 @@ contract TokenNetworkRegistry is Utils {
     event TokenNetworkCreated(address indexed token_address, address indexed token_network_address);
 
     modifier canCreateTokenNetwork() {
-        require(token_network_created == false);
+        require(token_network_created < max_token_networks);
         _;
     }
 
@@ -34,7 +35,8 @@ contract TokenNetworkRegistry is Utils {
         address _secret_registry_address,
         uint256 _chain_id,
         uint256 _settlement_timeout_min,
-        uint256 _settlement_timeout_max
+        uint256 _settlement_timeout_max,
+        uint256 _max_token_networks
     )
         public
     {
@@ -44,10 +46,12 @@ contract TokenNetworkRegistry is Utils {
         require(_settlement_timeout_max > _settlement_timeout_min);
         require(_secret_registry_address != address(0x0));
         require(contractExists(_secret_registry_address));
+        require(_max_token_networks > 0);
         secret_registry_address = _secret_registry_address;
         chain_id = _chain_id;
         settlement_timeout_min = _settlement_timeout_min;
         settlement_timeout_max = _settlement_timeout_max;
+        max_token_networks = _max_token_networks;
 
         deprecation_executor = msg.sender;
     }
@@ -57,14 +61,14 @@ contract TokenNetworkRegistry is Utils {
     /// @param _token_address Ethereum address of an already deployed token, to
     /// be used in the new TokenNetwork contract.
     function createERC20TokenNetwork(address _token_address)
-         canCreateTokenNetwork 
+        canCreateTokenNetwork
         external
         returns (address token_network_address)
     {
         require(token_to_token_networks[_token_address] == address(0x0));
 
         // We limit the number of token networks to 1 for the Bug Bounty release
-        token_network_created = true;
+        token_network_created = token_network_created + 1;
 
         TokenNetwork token_network;
 
diff --git a/raiden_contracts/deploy/__main__.py b/raiden_contracts/deploy/__main__.py
index 2b6d14b..5e57df8 100644
--- a/raiden_contracts/deploy/__main__.py
+++ b/raiden_contracts/deploy/__main__.py
@@ -247,6 +247,12 @@ def main():
     default=True,
     help='Save deployment info to a file.',
 )
+@click.option(
+    '--max-token-networks',
+    required=True,
+    help='The maximum number of tokens that can be registered.',
+    type=int,
+)
 @click.pass_context
 def raiden(
     ctx,
@@ -257,6 +263,7 @@ def raiden(
     gas_limit,
     save_info,
     contracts_version,
+    max_token_networks: int,
 ):
     setup_ctx(
         ctx,
@@ -268,7 +275,10 @@ def raiden(
         contracts_version,
     )
     deployer = ctx.obj['deployer']
-    deployed_contracts_info = deploy_raiden_contracts(deployer)
+    deployed_contracts_info = deploy_raiden_contracts(
+        deployer=deployer,
+        max_num_of_token_networks=max_token_networks,
+    )
     deployed_contracts = {
         contract_name: info['address']
         for contract_name, info in deployed_contracts_info['contracts'].items()
@@ -516,7 +526,8 @@ def deploy_and_remember(
 
 
 def deploy_raiden_contracts(
-    deployer: ContractDeployer,
+        deployer: ContractDeployer,
+        max_num_of_token_networks: int,
 ):
     """Deploy all required raiden contracts and return a dict of contract_name:address"""
 
@@ -540,6 +551,7 @@ def deploy_raiden_contracts(
             deployed_contracts['chain_id'],
             DEPLOY_SETTLE_TIMEOUT_MIN,
             DEPLOY_SETTLE_TIMEOUT_MAX,
+            max_num_of_token_networks,
         ],
         deployer,
         deployed_contracts,


Test patch:
diff --git a/raiden_contracts/tests/deprecation_switch_testnet.py b/raiden_contracts/tests/deprecation_switch_testnet.py
index 279f9e9..bfe8f31 100644
--- a/raiden_contracts/tests/deprecation_switch_testnet.py
+++ b/raiden_contracts/tests/deprecation_switch_testnet.py
@@ -97,7 +97,10 @@ def deprecation_test(
 
 
 def deprecation_test_setup(deployer, token_amount):
-    deployed_contracts = deploy_raiden_contracts(deployer)['contracts']
+    deployed_contracts = deploy_raiden_contracts(
+        deployer=deployer,
+        max_num_of_token_networks=1,
+    )['contracts']
 
     token_network_registry_abi = deployer.contract_manager.get_contract_abi(
         CONTRACT_TOKEN_NETWORK_REGISTRY,
diff --git a/raiden_contracts/tests/fixtures/token.py b/raiden_contracts/tests/fixtures/token.py
index 64b9944..717d64e 100644
--- a/raiden_contracts/tests/fixtures/token.py
+++ b/raiden_contracts/tests/fixtures/token.py
@@ -15,13 +15,21 @@ def custom_token_params(request):
 
 
 @pytest.fixture()
-def custom_token(deploy_tester_contract, custom_token_params):
+def custom_token_factory(deploy_tester_contract, custom_token_params):
+    """A function that deploys a CustomToken contract"""
+    def f():
+        return deploy_tester_contract(
+            CONTRACT_CUSTOM_TOKEN,
+            [],
+            custom_token_params,
+        )
+    return f
+
+
+@pytest.fixture()
+def custom_token(custom_token_factory):
     """Deploy CustomToken contract"""
-    return deploy_tester_contract(
-        CONTRACT_CUSTOM_TOKEN,
-        [],
-        custom_token_params,
-    )
+    return custom_token_factory()
 
 
 @pytest.fixture()
diff --git a/raiden_contracts/tests/fixtures/token_network_registry.py b/raiden_contracts/tests/fixtures/token_network_registry.py
index 5c4bf60..e5dd79c 100644
--- a/raiden_contracts/tests/fixtures/token_network_registry.py
+++ b/raiden_contracts/tests/fixtures/token_network_registry.py
@@ -24,7 +24,12 @@ def get_token_network_registry(deploy_tester_contract):
 
 
 @pytest.fixture
-def token_network_registry_contract(deploy_tester_contract, secret_registry_contract, web3):
+def token_network_registry_contract(
+        deploy_tester_contract,
+        secret_registry_contract,
+        web3,
+        custom_token,
+):
     """Deployed TokenNetworkRegistry contract"""
     return deploy_tester_contract(
         CONTRACT_TOKEN_NETWORK_REGISTRY,
@@ -34,6 +39,7 @@ def token_network_registry_contract(deploy_tester_contract, secret_registry_cont
             int(web3.version.network),
             TEST_SETTLE_TIMEOUT_MIN,
             TEST_SETTLE_TIMEOUT_MAX,
+            1,
         ],
     )
 
diff --git a/raiden_contracts/tests/test_contract_limits.py b/raiden_contracts/tests/test_contract_limits.py
index 0e9f340..fba99e5 100644
--- a/raiden_contracts/tests/test_contract_limits.py
+++ b/raiden_contracts/tests/test_contract_limits.py
@@ -4,9 +4,37 @@ from raiden_contracts.constants import (
     MAX_ETH_CHANNEL_PARTICIPANT,
     MAX_ETH_TOKEN_NETWORK,
     ParticipantInfoIndex,
+    TEST_SETTLE_TIMEOUT_MIN,
+    TEST_SETTLE_TIMEOUT_MAX,
 )
 
 
+def test_register_three_but_not_four(
+        web3,
+        get_token_network_registry,
+        secret_registry_contract,
+        custom_token_factory,
+):
+    """ Check that TokenNetworkRegistry observes the max number of tokens """
+    token_network_registry = get_token_network_registry([
+        secret_registry_contract.address,
+        int(web3.version.network),
+        TEST_SETTLE_TIMEOUT_MIN,
+        TEST_SETTLE_TIMEOUT_MAX,
+        3,
+    ])
+    assert token_network_registry.functions.max_token_networks().call() == 3
+    token0 = custom_token_factory()
+    token1 = custom_token_factory()
+    token2 = custom_token_factory()
+    token3 = custom_token_factory()
+    token_network_registry.functions.createERC20TokenNetwork(token0.address).transact()
+    token_network_registry.functions.createERC20TokenNetwork(token1.address).transact()
+    token_network_registry.functions.createERC20TokenNetwork(token2.address).transact()
+    with pytest.raises(TransactionFailed):
+        token_network_registry.functions.createERC20TokenNetwork(token3.address).transact()
+
+
 def test_channel_participant_deposit_limit_value(token_network):
     """ Check the channel participant deposit limit """
     limit = token_network.functions.channel_participant_deposit_limit().call()
diff --git a/raiden_contracts/tests/test_deploy_script.py b/raiden_contracts/tests/test_deploy_script.py
index 7f570dc..1205c61 100644
--- a/raiden_contracts/tests/test_deploy_script.py
+++ b/raiden_contracts/tests/test_deploy_script.py
@@ -48,7 +48,7 @@ def test_deploy_script_raiden(
         wait=10,
     )
 
-    deployed_contracts_info = deploy_raiden_contracts(deployer)
+    deployed_contracts_info = deploy_raiden_contracts(deployer, 1)
 
     verify_deployment_data(
         web3=deployer.web3,
@@ -141,7 +141,7 @@ def test_deploy_script_raiden(
         wait=10,
     )
     with pytest.raises(ValidationError):
-        deploy_raiden_contracts(deployer)
+        deploy_raiden_contracts(deployer, 1)
 
 
 def test_deploy_script_token(
@@ -219,7 +219,10 @@ def test_deploy_script_register(
         wait=10,
     )
 
-    deployed_contracts_raiden = deploy_raiden_contracts(deployer)
+    deployed_contracts_raiden = deploy_raiden_contracts(
+        deployer=deployer,
+        max_num_of_token_networks=1,
+    )
     deployed_token = deploy_token_contract(
         deployer,
         token_supply=10000000,
diff --git a/raiden_contracts/tests/test_deprecation_switch.py b/raiden_contracts/tests/test_deprecation_switch.py
index a6c6ca5..1d580e1 100644
--- a/raiden_contracts/tests/test_deprecation_switch.py
+++ b/raiden_contracts/tests/test_deprecation_switch.py
@@ -42,12 +42,13 @@ def test_deprecation_executor(
             int(web3.version.network),
             TEST_SETTLE_TIMEOUT_MIN,
             TEST_SETTLE_TIMEOUT_MAX,
+            1,
         ],
     )
 
     # Make sure deployer is deprecation_executor
     assert token_network_registry.functions.deprecation_executor().call() == deprecation_executor
-    assert token_network_registry.functions.token_network_created().call() is False
+    assert token_network_registry.functions.token_network_created().call() == 0
 
     # We can only deploy one TokenNetwork contract
     # It can be deployed by anyone
@@ -56,7 +57,7 @@ def test_deprecation_executor(
     ).transact(
         {'from': B},
     )
-    assert token_network_registry.functions.token_network_created().call() is True
+    assert token_network_registry.functions.token_network_created().call() == 1
 
     # No other TokenNetworks can be deployed now
     with pytest.raises(TransactionFailed):
diff --git a/raiden_contracts/tests/test_print_gas.py b/raiden_contracts/tests/test_print_gas.py
index 651b6ad..03e3c42 100644
--- a/raiden_contracts/tests/test_print_gas.py
+++ b/raiden_contracts/tests/test_print_gas.py
@@ -31,6 +31,7 @@ def test_token_network_registry(
             int(web3.version.network),
             TEST_SETTLE_TIMEOUT_MIN,
             TEST_SETTLE_TIMEOUT_MAX,
+            10,
         ],
     )
     print_gas(txhash, CONTRACT_TOKEN_NETWORK_REGISTRY + ' DEPLOYMENT')
diff --git a/raiden_contracts/tests/test_token_network_registry.py b/raiden_contracts/tests/test_token_network_registry.py
index c208bc5..cced0d9 100644
--- a/raiden_contracts/tests/test_token_network_registry.py
+++ b/raiden_contracts/tests/test_token_network_registry.py
@@ -38,77 +38,145 @@ def test_constructor_call(
 
     # failure with an int instead of the SecretRegistry's address
     with pytest.raises(TypeError):
-        get_token_network_registry([3, chain_id, settle_min, settle_max])
+        get_token_network_registry([3, chain_id, settle_min, settle_max, 1])
 
     # failure with zero instead of the SecretRegistry's address
     with pytest.raises(TypeError):
-        get_token_network_registry([0, chain_id, settle_min, settle_max])
+        get_token_network_registry([0, chain_id, settle_min, settle_max, 1])
 
     # failure with the empty string instead of the SecretRegistry's address
     with pytest.raises(TypeError):
-        get_token_network_registry(['', chain_id, settle_min, settle_max])
+        get_token_network_registry(['', chain_id, settle_min, settle_max, 1])
 
     # failure with an odd-length hex string instead of the SecretRegistry's address
     with pytest.raises(TypeError):
-        get_token_network_registry([FAKE_ADDRESS, chain_id, settle_min, settle_max])
+        get_token_network_registry([FAKE_ADDRESS, chain_id, settle_min, settle_max, 1])
 
     # failure with the empty string instead of a chain ID
     with pytest.raises(TypeError):
-        get_token_network_registry([secret_registry_contract.address, '', settle_min, settle_max])
+        get_token_network_registry([
+            secret_registry_contract.address,
+            '',
+            settle_min,
+            settle_max,
+            1,
+        ])
 
     # failure with a string instead of a chain ID
     with pytest.raises(TypeError):
-        get_token_network_registry([secret_registry_contract.address, '1', settle_min, settle_max])
+        get_token_network_registry([
+            secret_registry_contract.address,
+            '1',
+            settle_min,
+            settle_max,
+            1,
+        ])
 
     # failure with a negative integer instead of a chain ID
     with pytest.raises(TypeError):
-        get_token_network_registry([secret_registry_contract.address, -3, settle_min, settle_max])
+        get_token_network_registry([
+            secret_registry_contract.address,
+            -3,
+            settle_min,
+            settle_max,
+            1,
+        ])
 
     # failure with chain ID zero
     with pytest.raises(TransactionFailed):
-        get_token_network_registry([secret_registry_contract.address, 0, settle_min, settle_max])
+        get_token_network_registry([
+            secret_registry_contract.address,
+            0,
+            settle_min,
+            settle_max,
+            1,
+        ])
 
     # failure with strings instead of the minimal challenge period
     with pytest.raises(TypeError):
-        get_token_network_registry([secret_registry_contract.address, chain_id, '', settle_max])
+        get_token_network_registry([
+            secret_registry_contract.address,
+            chain_id,
+            '',
+            settle_max,
+            1,
+            1,
+        ])
     with pytest.raises(TypeError):
-        get_token_network_registry([secret_registry_contract.address, chain_id, '1', settle_max])
+        get_token_network_registry([
+            secret_registry_contract.address,
+            chain_id,
+            '1',
+            settle_max,
+            1,
+            1,
+        ])
     with pytest.raises(TypeError):
-        get_token_network_registry([secret_registry_contract.address, chain_id, -3, settle_max])
+        get_token_network_registry([
+            secret_registry_contract.address,
+            chain_id,
+            -3,
+            settle_max,
+            1,
+            1,
+        ])
 
     # failure with strings instead of the max challenge period
     with pytest.raises(TypeError):
-        get_token_network_registry([secret_registry_contract.address, chain_id, settle_min, ''])
+        get_token_network_registry([secret_registry_contract.address, chain_id, settle_min, '', 1])
     with pytest.raises(TypeError):
-        get_token_network_registry([secret_registry_contract.address, chain_id, 'settle_min, 1'])
+        get_token_network_registry([
+            secret_registry_contract.address,
+            chain_id,
+            'settle_min, 1',
+            1])
     with pytest.raises(TypeError):
-        get_token_network_registry([secret_registry_contract.address, chain_id, settle_min, -3])
+        get_token_network_registry([secret_registry_contract.address, chain_id, settle_min, -3, 1])
 
     # failure with Ethereum accounts that doesn't look like a SecretRegistry
     with pytest.raises(TransactionFailed):
-        get_token_network_registry([EMPTY_ADDRESS, chain_id, settle_min, settle_max])
+        get_token_network_registry([EMPTY_ADDRESS, chain_id, settle_min, settle_max, 1])
     with pytest.raises(TransactionFailed):
-        get_token_network_registry([A, chain_id, settle_min, settle_max])
+        get_token_network_registry([A, chain_id, settle_min, settle_max, 1])
 
     # failures with chain_id zero
     with pytest.raises(TransactionFailed):
-        get_token_network_registry([secret_registry_contract.address, 0, 0, settle_max])
+        get_token_network_registry([secret_registry_contract.address, 0, 0, settle_max, 1])
     with pytest.raises(TransactionFailed):
-        get_token_network_registry([secret_registry_contract.address, 0, settle_min, 0])
+        get_token_network_registry([secret_registry_contract.address, 0, settle_min, 0, 1])
     with pytest.raises(TransactionFailed):
-        get_token_network_registry([secret_registry_contract.address, 0, settle_max, settle_min])
+        get_token_network_registry([
+            secret_registry_contract.address,
+            0,
+            settle_max,
+            settle_min,
+            1,
+        ])
 
     # failures with nonsense challenge periods
     with pytest.raises(TransactionFailed):
-        get_token_network_registry([secret_registry_contract.address, chain_id, 0, settle_max])
+        get_token_network_registry([secret_registry_contract.address, chain_id, 0, settle_max, 1])
     with pytest.raises(TransactionFailed):
-        get_token_network_registry([secret_registry_contract.address, chain_id, settle_min, 0])
+        get_token_network_registry([secret_registry_contract.address, chain_id, settle_min, 0, 1])
     with pytest.raises(TransactionFailed):
         get_token_network_registry([
             secret_registry_contract.address,
             chain_id,
             settle_max,
             settle_min,
+            1,
+        ])
+
+    # failures with nonsense token number limits
+    with pytest.raises(TransactionFailed):
+        get_token_network_registry([secret_registry_contract.address, chain_id, 0, settle_max, 0])
+    with pytest.raises(TypeError):
+        get_token_network_registry([
+            secret_registry_contract.address,
+            chain_id,
+            0,
+            settle_max,
+            'limit',
         ])
 
     get_token_network_registry([
@@ -116,6 +184,7 @@ def test_constructor_call(
         chain_id,
         settle_min,
         settle_max,
+        1,
     ])
 
 
@@ -129,11 +198,13 @@ def test_constructor_call_state(web3, get_token_network_registry, secret_registr
         chain_id,
         TEST_SETTLE_TIMEOUT_MIN,
         TEST_SETTLE_TIMEOUT_MAX,
+        30,
     ])
     assert secret_registry_contract.address == registry.functions.secret_registry_address().call()
     assert chain_id == registry.functions.chain_id().call()
     assert TEST_SETTLE_TIMEOUT_MIN == registry.functions.settlement_timeout_min().call()
     assert TEST_SETTLE_TIMEOUT_MAX == registry.functions.settlement_timeout_max().call()
+    assert 30 == registry.functions.max_token_networks().call()
 
 
 def test_create_erc20_token_network_call(