From 14948393b496e8b1f3f6717fbe58df1413a5190e Mon Sep 17 00:00:00 2001 From: Jonas Theis <mail@jonastheis.de> Date: Thu, 16 Apr 2020 13:52:54 +0200 Subject: [PATCH] Integration tests (#312) * Add docker compose for running integration tests. Runs entry_node and arbitrary number of peers in docker network * Fix permission denied in container if run without mounting a `rw` volume making it possible to run as throw-away container. Remove `VOLUME` from Dockerfile as this only pollutes host system with anonymous volumes. * Use named network for easier external use * Add test container that discovers peers and waits for autopeering to happen * Fix min waitForNeighbors * Add go.sum * Run integration tests with Github Actions * Added framework that abstracts the docker network and provides convenience functionality * Update directory in Github Actions * Add bash script for automated local test execution * Add getMessageByHash endpoint * Adjust to merge changes * Add methods to easily do HTTP POST requests * Added relay message test * Increase client timeout * Verbose output for tests makes it easier to follow the execution * Introduce small API wrapper for GoShimmer HTTP API * Adjust relay test to use new API wrapper * WIP: Docker logs * Fix issue with serving visualizer analysis server of entry node * Persist logs of containers after CI run * Fix test file * Fix uploading of artifacts * Save all containers' logs as artifacts * Create logs files also with local run * Add possibility to retrieve logs from a peer via Docker logs * Make tester part of the goshimmer module to make code sharing possible * Use client/lib to make HTTP requests in tester * Fix unit test directory * Add comments/doc to the code * Add readme * Move tester to own module and don't build container but use existing golang one instead * Address PR comments * Adjust to merge * Only use 1 config file for all containers * go mod tidy * Rename client lib base url --- .github/workflows/integration-tests.yml | 50 ++ .github/workflows/test.yml | 2 +- Dockerfile | 4 +- client/autopeering.go | 2 +- client/lib.go | 16 +- client/message.go | 2 +- docker-compose.yml | 2 +- images/integration-testing-setup.png | Bin 0 -> 52960 bytes .../httpserver/packrd/packed-packr.go | 25 +- .../webinterface/httpserver/static/js/main.js | 2 +- plugins/webapi/getMessageByHash/plugin.go | 86 +++ tools/integration-tests/README.md | 53 ++ tools/integration-tests/config.docker.json | 73 +++ tools/integration-tests/docker-compose.yml | 51 ++ tools/integration-tests/logs/.gitkeep | 0 tools/integration-tests/runTests.sh | 32 ++ .../tester/docker-compose.yml | 17 + .../tester/framework/framework.go | 99 ++++ .../tester/framework/parameters.go | 11 + .../tester/framework/peer.go | 102 ++++ tools/integration-tests/tester/go.mod | 16 + tools/integration-tests/tester/go.sum | 543 ++++++++++++++++++ .../tester/tests/dockerlogs_test.go | 23 + .../tester/tests/main_test.go | 24 + .../tester/tests/relaymessage_test.go | 51 ++ 25 files changed, 1259 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/integration-tests.yml create mode 100644 images/integration-testing-setup.png create mode 100644 plugins/webapi/getMessageByHash/plugin.go create mode 100644 tools/integration-tests/README.md create mode 100644 tools/integration-tests/config.docker.json create mode 100644 tools/integration-tests/docker-compose.yml create mode 100644 tools/integration-tests/logs/.gitkeep create mode 100755 tools/integration-tests/runTests.sh create mode 100644 tools/integration-tests/tester/docker-compose.yml create mode 100644 tools/integration-tests/tester/framework/framework.go create mode 100644 tools/integration-tests/tester/framework/parameters.go create mode 100644 tools/integration-tests/tester/framework/peer.go create mode 100644 tools/integration-tests/tester/go.mod create mode 100644 tools/integration-tests/tester/go.sum create mode 100644 tools/integration-tests/tester/tests/dockerlogs_test.go create mode 100644 tools/integration-tests/tester/tests/main_test.go create mode 100644 tools/integration-tests/tester/tests/relaymessage_test.go diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml new file mode 100644 index 00000000..38944667 --- /dev/null +++ b/.github/workflows/integration-tests.yml @@ -0,0 +1,50 @@ +name: Test GoShimmer +on: + push: + pull_request: + types: [opened, reopened] +jobs: + + integration-test: + name: Integration Tests + runs-on: ubuntu-latest + steps: + + - name: Check out code + uses: actions/checkout@v2 + + - name: Build GoShimmer Docker network + run: docker-compose -f tools/integration-tests/docker-compose.yml up -d --scale peer_replica=5 --build + + - name: Dispay containers + run: docker ps -a + + - name: Run integration tests + run: docker-compose -f tools/integration-tests/tester/docker-compose.yml up --abort-on-container-exit --exit-code-from tester --build + + - name: Stop GoShimmer Docker network + if: always() + run: docker-compose -f tools/integration-tests/docker-compose.yml stop + + - name: Create logs from containers in network + if: always() + run: | + docker logs entry_node > tools/integration-tests/logs/entry_node.log + docker logs peer_master > tools/integration-tests/logs/peer_master.log + docker logs integration-tests_peer_replica_1 > tools/integration-tests/logs/peer_replica_1.log + docker logs integration-tests_peer_replica_2 > tools/integration-tests/logs/peer_replica_2.log + docker logs integration-tests_peer_replica_3 > tools/integration-tests/logs/peer_replica_3.log + docker logs integration-tests_peer_replica_4 > tools/integration-tests/logs/peer_replica_4.log + docker logs integration-tests_peer_replica_5 > tools/integration-tests/logs/peer_replica_5.log + docker logs tester > tools/integration-tests/logs/tester.log + + - name: Save logs as artifacts + if: always() + uses: actions/upload-artifact@v1 + with: + name: container-logs + path: tools/integration-tests/logs + + - name: Clean up + if: always() + run: docker-compose -f tools/integration-tests/docker-compose.yml down diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 61759884..8f763dba 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,7 +6,7 @@ on: jobs: build: - name: Test GoShimmer + name: Unit tests runs-on: ubuntu-latest steps: diff --git a/Dockerfile b/Dockerfile index 62df6521..eb159806 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,8 +34,6 @@ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ # user:group is nonroot:nonroot, uid:gid = 65532:65532 FROM gcr.io/distroless/static@sha256:23aa732bba4c8618c0d97c26a72a32997363d591807b0d4c31b0bbc8a774bddf -VOLUME /mainnetdb - EXPOSE 14666/tcp EXPOSE 14626/udp @@ -44,4 +42,4 @@ COPY --from=build /go/bin/goshimmer /run/goshimmer # Copy the default config COPY config.default.json /config.json -ENTRYPOINT ["/run/goshimmer", "--config-dir=/", "--database.directory=/mainnetdb"] +ENTRYPOINT ["/run/goshimmer", "--config-dir=/", "--database.directory=/tmp/mainnetdb"] diff --git a/client/autopeering.go b/client/autopeering.go index 32796b9b..3d8e514b 100644 --- a/client/autopeering.go +++ b/client/autopeering.go @@ -8,7 +8,7 @@ import ( ) const ( - routeGetNeighbors = "getNeighbors" + routeGetNeighbors = "autopeering/neighbors" ) // GetNeighbors gets the chosen/accepted neighbors. diff --git a/client/lib.go b/client/lib.go index 1201aa1c..4e452712 100644 --- a/client/lib.go +++ b/client/lib.go @@ -24,17 +24,17 @@ const ( contentTypeJSON = "application/json" ) -func NewGoShimmerAPI(node string, httpClient ...http.Client) *GoShimmerAPI { +func NewGoShimmerAPI(baseUrl string, httpClient ...http.Client) *GoShimmerAPI { if len(httpClient) > 0 { - return &GoShimmerAPI{node: node, httpClient: httpClient[0]} + return &GoShimmerAPI{baseUrl: baseUrl, httpClient: httpClient[0]} } - return &GoShimmerAPI{node: node} + return &GoShimmerAPI{baseUrl: baseUrl} } // GoShimmerAPI is an API wrapper over the web API of GoShimmer. type GoShimmerAPI struct { httpClient http.Client - node string + baseUrl string jwt string } @@ -62,7 +62,7 @@ func interpretBody(res *http.Response, decodeTo interface{}) error { case http.StatusInternalServerError: return fmt.Errorf("%w: %s", ErrInternalServerError, errRes.Error) case http.StatusNotFound: - return fmt.Errorf("%w: %s", ErrNotFound, errRes.Error) + return fmt.Errorf("%w: %s", ErrNotFound, res.Request.URL.String()) case http.StatusBadRequest: return fmt.Errorf("%w: %s", ErrBadRequest, errRes.Error) case http.StatusUnauthorized: @@ -86,7 +86,7 @@ func (api *GoShimmerAPI) do(method string, route string, reqObj interface{}, res } // construct request - req, err := http.NewRequest(method, fmt.Sprintf("%s/%s", api.node, route), func() io.Reader { + req, err := http.NewRequest(method, fmt.Sprintf("%s/%s", api.baseUrl, route), func() io.Reader { if data == nil { return nil } @@ -121,3 +121,7 @@ func (api *GoShimmerAPI) do(method string, route string, reqObj interface{}, res } return nil } + +func (api *GoShimmerAPI) BaseUrl() string { + return api.baseUrl +} diff --git a/client/message.go b/client/message.go index 74f9ab16..46371413 100644 --- a/client/message.go +++ b/client/message.go @@ -7,7 +7,7 @@ import ( ) const ( - routeFindById = "findById" + routeFindById = "message/findById" ) // FindMessageById finds messages by the given ids. The messages are returned in the same order as diff --git a/docker-compose.yml b/docker-compose.yml index 42affc44..9b63d434 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,7 +14,7 @@ services: # make sure to give read/write access to the folder ./mainnetdb (e.g., chmod -R 777 ./mainnetdb) # optionally, you can mount a config.json into the container volumes: - - ./mainnetdb/:/mainnetdb/:rw + - ./mainnetdb/:/tmp/mainnetdb/:rw #- ./config.json:/config.json:ro # Expose ports: # gossip: - "14666:14666/tcp" diff --git a/images/integration-testing-setup.png b/images/integration-testing-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..8d59e14b6a61cad794f499b25258c179cd057519 GIT binary patch literal 52960 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 XL%gZ$Ek83bFfe$!`njxgN@xNA4XFBG literal 0 HcmV?d00001 diff --git a/plugins/analysis/webinterface/httpserver/packrd/packed-packr.go b/plugins/analysis/webinterface/httpserver/packrd/packed-packr.go index 4241a136..8b691e01 100644 --- a/plugins/analysis/webinterface/httpserver/packrd/packed-packr.go +++ b/plugins/analysis/webinterface/httpserver/packrd/packed-packr.go @@ -11,14 +11,14 @@ import ( ) var _ = func() error { - const gk = "4c80c379ef2b80415266c114d9f8d6a8" + const gk = "121d14fc26d6554942f445fcba76462d" g := packr.New(gk, "") hgr, err := resolver.NewHexGzip(map[string]string{ - "166310f2d73113b478111b0a976a0eea": "1f8b08000000000000ff9c57793494fbff7f701b528454f6a6414d0bb330c34c46b319141a63494a356661304b331343ca9232527675254b961a85b2e5226d52e426a25c1165c992352d971a7ec7fdd5fdfeceefdc73fff87ece79ce799ecf79bd5eefcffbf5bc9ef7394f1cd5c55e4d554f150000354707320d0000e6f2a5020200403090ee0e0080aed8ce4becc6678b43e842164060f27d5960472edd8f4563d199a1479b593600a0c4e6b87b89bd9c9db00c3ed79cbe8c31977005c0f2b2d92511d019812c31d897e5c7e1e120d375f720600e1307d98772863b0b482c7f8e439890e516e6e2ce080b646098905db6601b0956c2157059623a58c20de289b0121ce42f5d2c4f845dde8641c07f41c48138c8ff1ecacb990a26f1852c30cadcc28c014720c068b439c2128546237680917004120647c2e0683384251685c622adc03f16c4166c2364b2b13432e5472d21938d83f88bc5022c0c161212621e6261ce17fac110180c66590389341332d966a2509e982e31e3898c7f2a9059228690231073f83cf0f233dd977f4c8c83407eb6c015383bff2dcc13fd308ac1e7c22474010c610e8771b9b09f689198c662ff3b5ae41e2a60c1682c11ff9890c1a2b1d8c6ffa7d4bf539781026767ec5e21c78fc3a30791f98c635c164fec48c641245c813993c3c492e0d61696240286802212ed3008040665412158a348186b22dc9a6205ffa9f14f5c0ba2350a498193ec50966404c20e43b023910948b21d91444121d094bfb98e3c9198ce63b07e7239ffe112ff958b25095974315fe8cee707fd4c00d59f2fe68bfcf90230c90d0d86eee3f098fc10d1d6e5d7f3e3a42c212798c5a408f95cf05ffe6239ff509f648724a0911824c5924859eedbdadace92842120890822c20e4db484fce032ff1bcf60b6601bd8ff0bcbcf2d1a99b27cfb77f46dc1fff978583c260e2284ecb2456c7c1a0100aad71cc90477c9eb091f1f2783ae757d1972852f1b2fbcf94c73d3d5dbd2d4b6704d637f00637f952fd3f4d9814ec87ed4f5dac71f1999328f02879262cfaa8517b15f1acf2b30b679941ffeded95975c3ab64d89aaad963b6127de445658bf98e6f4b4b56f256f6556f2a42837d41579828c6357c6eed3d3e15f2bc6624fbf894615642f275697e0408045aece8eb9b82673ebb1a6e7b737bfaee4bb23b6095dadd857983d6a5bd9d9deec80ca733be653298b6eacbf09219aaf9c563eab1f96fe7e6074043f506f18dde5cf401739dd52e8f078faa3b71cee88ab3779348a7ba0667c56834baf5667171cc8b31cb9bebf0b2ecb7044047f9b28b9f85822f79f39a4b7afafac7dd185ae6e08cbadada430a16bb769b684d1fbc77527e1b84f268895bbbe5a4aa6d8206d820ec02909efe48fec8b3dfd2dafa37c6c1a400c38d1bf9163aab2903efde3e3815353535158707e7769c4d4b4c4878519818135d701a682760ad470f2fceddd1783ed90b3479c4e28df6b9dcecfa905b2b79f144676fc152c70baf56d20a9187c6fd18a3b0ae5c5643cce3b566fafb6411eb941463623d3e5a1ba83f47e48b4680a8b36a1448f25645135b14eab33c08fd6d73e045c3fc4f0db16b22d4a82e49976a37a89ede761176d8bc22b81b71c96573ea4646244c0b6cf7ca68a70b0b31761b97d4404c7d23cc53f0d62b48372a2eb229dc818cdb1097f86ca69c8b87375c4c5750fc7562f6a0f935e30d525a2455d7fd42bbbf89687f7282697d6aaf6b5a9349bf34c74c41f8fe775d25d53181b5812de09a96baf23a74b344f1bd8665c9af898dbe7b1c149d67864076e27d495e1278e2383943f1e9fba16db17d24eea9e6eb9ad33e4e85b4bd7442ba8a06c6342633236336d4263be7ca7d05787a5ef3af079da8ac76b71515dd0715ffe0e73fe853300e3565f7fed2f4e8510cb7ffee897e5243fde98f9fa039c64569f11b03f493d6599efd66456d7dcaceee51053fdeb2373b5c572dadf117b656d388abf4960fc804b7eab3fb2daf1d86b27065fcd1c1a75b0b7b62636343af758c9130874f55ee6c3f5ea4bcebf4183fa5a5e37cad9b6e74cfe4a24a0aad77e278b5a2038bc532958a1dcb5598b79113caea0692c691b9faf657af3c15496713defb838d1d37466ec8d583f9d4054f5ef8dd2e491a936c8b89580ce754f48d9400448de771631126b12257b1d6c995290f3b70f3e2f12301aa26a793b4de5c21c52ebe7cf912b5f59a1badbccfe19823c3dea77807e6727c4a40b46ae79ebb45619ac53bd41917930d5276634cabf35e856685490fafa2e21cb82e8e879e48151e4a151e02f44740f73a930fe525cce3a91bed2f4575c4f85764bb9450cd72aafa401849fa0a8d222dcb95014141c5afe75272b6673ef3ec601b047a839bf73819f90ea4ffa92df7bc2191dfc96d5254f1002c7a37bb4fd839691fbecfdcee57d12d39b894ec60b299f3a54e1fd8046f3aaf1e37ba028c7b5b455cf9953db378ff08dc29aaeb61b004d5b4c9b0a1a161a1afaf6fe4cb44f7dcfa6de1e55428d5cbef21af3a316db7a990eca9db8e75251dae0f7b193adeb97517b6e703bba21b7448ad92a75432b3b3b23171b6225aefb1c6e0c444d09ecda9f3403debc13bc104e9f45eb49555ddcad5351b2282b534a8fa05773b2683ad9415a30e5ca1fab7fa9669df39345d07402b7c9c6f71f1642bfbadebe39fe5e62d51606521c1c1775ff7f52da67846dfae1e6573f0f9736dc07e07f91fcf32adfaed959d6a0e96162e2e2e965bde9a96c5fc295fd4daa669d26ea8af2f72f32336fef686b9bfe4d2f6993bf83d5d381c4e4176ab3b2a4a212a32c9f8fe81f53e908cc8826c9971fbc0b9d2d6433d6199f59543abaa8aef09de45833f9ac587de8c11f657e16d48ac8a0cac280bee1b09c777b20e21f19d96d4dd9efaf37169de2f0a919d680e4ae68c241fb03daf1bd13e26f6243816d2ca63d25fb5ae15d618d48408037ab885b53e6efeb27064467833affa498967a081d6c711df329d8bc605eee268ac4b8eed09e4faf8132b724394d26c86e3dfd9af4e42dd0e5fa1969e919525bfdd321cb64e8b68d4cc07e392480b140ae59c7da2d1e4e7b0fafca473a0c8078d83b3d052c5d3c9d7e9dbab2e019a79eda34a0e8f8605d64179d6fd0909096bdef0be469fabafe68485d59a66b92c81c0969074c192f6f052fa78ee1953450f00a25e9cdcd8d8d8e3301dd75d5817326d9eb333a4146a3cda4d861cfdda9e6fffd5d4ec8cb6a19eded3cea9e1235ad18f67bec97565e79cb846a6b3a3abf7ebad6269cf66e327eb64169d81a2a4aba0635bd53d9b439b2b82f714b1a61ad8e341be4dcbe176bd78881d19aee050d47a55966eb7a5def14062f396aa8c26dbe6775b30f282b55d43e74ea6eda82db9e05a51262bcfb69379e3c9a0add2e2daf964452564c6395e7d56695e4f5ead0bb7ccebface0ac0b7900a756faa81da1fbcd8b9890a4a444aceda6a575f4e47303640c767748fe5f7bf40500db2d741035ce39a0b6891eed53af690645bf84cc3d5ab57b5819a158fd94bfda1d24f56c31be21b471e0c554f04d73d0b427f18c30c2d29ccb7f47cfe72f689c278db561bc97448f20ecf1b55e7cab5a0733087c4ae1bfa18f4ec84e8cf672d72b9fc5bfb832fa9e24d39fd2e7fc80622a510e777bb0ac910cdcb3939fd394e9b238605d690ca28a3f98a0f9f7bcbca102db3834f0ef7d4854cc3e25cc74b9af6becdd8e9d0221cfddedeeedaf1ae21f65e02f26402b2f81720ec7823bb62be7d70e3cd6ab470f8e9ba9632c6930425e9e1dc7ceb077ee67ae74f9e5dda56bcc52340b14011ce265e699b6694fd7a8c4ebf3231376f4b31762add5067821c528d6de09694940c1716161eff2de753587d84bd71382456e45a7c60b0b7f7f28af1e9eaa483abfa22548edc91524a836e69b03333329a2536d97ba8856a49a536f7bfabcc2fa56d37dae3884f696969f99a34fa9df23477a6b1a9ad8dca53cadaf380ad38293d4dae5f155773eece2dadd6c6b1b1b13582bdb16bbf038c275645bd6ad9f1574ed5c77eb27ae3a7ccdf6d333c6c64cf547e34fd75c4f5815d514aca92bf85ba0db6360af4bab5d5656aa0317e486e96b23ba9e5779311885e44f2ea187d2b9e25f1fc6bf4f81bc8de1aef6b439e92d7b3841375ea361c5cbde7e926ee544262e29c4e9b73e6093e2e2be57aa6ceaba3d5e9dbdea85c3f8fa597aea5acd6a0acd600a91883549462349562fe1eb1f4ca339db777916146330fbb9a9b9bda073664ed837ca54df080980b24681b5e4a8618707fdf273c1e29fe8db039f5cac76dc29bdf397a1a47cd0e78797b2fb40d0bb32abc4b4282d00708cd3ecec05d9dd5a0e9cacacaefcdbceafeab70d3dbbb982870cb6851c49d88a593aa69631f3edc80ca88bf44ca3950ed5acdf39441434343ccd572cf1b6b381996508582211de19789fd0b52fc25dae4751325a61ab46a95dbe7c5f204ef81a4aa85c9871efae1a3ab9407089c75b534f74dc97fbe5bff2c5ce6951ae9f04a036573a23b125bddccdc2655e6bf870614d6d4d42ce89ff58a7b3278f624766cd51a15b5bbfefe58c19ce262f84981809a78af4e5873d9d6407de997f9fea84f6d5dea46830bc1d8ac562db013513b2f3959f3446060e0f36463fb85f63f606d21e1636bfba2f060657ced79cae0beb14c1adc0f073cc9adeaa056e9f411b246a129f99ea92547951a93fbba4eaca7374935f37d48063dca3273dfa9907f723e7279862e8f511d043e5849be2f5201703603e3e232da84cbbf828e762ee452e291e8ff090000ffff241161e8770e0000", - "2f53e054245e3cec681be9135541dbcb": "1f8b08000000000000ff9c544f8f9b3e14bce753bc9f7fe7e06c0e55d5029736daaeaadd54bbabae7a74cc039cf89fec076dfae92b2024e44f2f3d016fc6e399b145fadfe7f5a7d71fdf565093d1f92c1d1f288a7c0600901a2401b216212265aca172fe9e013f80a448637eef5e6a650c0698c313d24f1776f05dc54668f51b43ca07d6b0422bbb83803a6391f61a638d480c68ef316384bf88cb1819d401cb8cf1488294ec46dcba607abda4231cc4a20ccad374f556b462983288419e34b691b7aa155510be9e2f92bb65b2488cb2c936b23ce5c3927f5235e24a25e5437fb374e38a3df44133b611725705d7d8e203fcbf5c2cef96ef3e8e410ad5822a32a65de50eb37eeefb69df1fcbefd72f5f1e1e1f57cfe926e44fabd7b7f5f3d794fb095d990aa416311e94cecd2a53f1cac5c4db8a81d094b1e3c18d3e78a1da7c76eea9af4c76f96e80ca96370c771b367d25fe0616509833c68932ca461441d66f41787f34774a697d4313daf4fa30f05a48ac9d2e308c04285d00eb0a4c92848168c84967bc46c28cb9b2bcad3f686e1a226759bf9bd428028356e806c7af1c4ee6877eaeb2741bc7b5d5cae231d02d706c78daf3b510098a9786fd117e282e4a9fe0cafe1d730d5d9ed629cde135e5dd6dee6e35efff127f020000ffffe59390183c040000", - "853579e9f8c28c5a0ea8a5ed642bbad0": "1f8b08000000000000ffecbded7adb38b230f87faf82d6798f06b04ab424dbe90e15c4eb244e4fce3a4e3671cf4c3f1a1d0f2d42123b14a006415b6a4917b03ff70af616f712f6c1074990a2ec74bfe73dbfb63b8f450085ef42a15055281c4d333691316788e24d3c452d7eff2b9dc8162172bda47cead1d5920b99b6dbad8c45741a331ab58ef2c4058fb28462f3e35b5042111ed224a59e2a2f2fbf2cd194d26e9b5f3f5c44d87ca2d118a8c9ba790885c7864d753ec62ce28f178c988fa0096696f0fb30b960c47c34c2a43499b6db8811f58181f97f8b1f42d5f6dd0e1583823782ca4c302f8ff128622041e04d11c35108991ebc23390ac7e68be92fd58b94348c81a0bf65b1a0edb6fd18aa3c59bb9d625b5f8a4238ea61151fe771b18d53a54e09a38fde95105ca0d6db90312ebd69cc223b25de5f5a9db0d3fa4b0b0fe55cf0476fea4f784449ebe3a7773f5f5fdddd7cbabd7bffe9e79b772d98ee547913a2da4e36760e83cd6e37547d18f5c6fe244c1234c9a7175c8c515925d180fdf1888e87b6a91cc90b1950bc830994392998b1db592855659eb89b72815471f1f78c1784a4370c5f093fa16c26e7c3b0d3c11c0935e845137668d30f46656b55e5a6c58250d46233112ee7be0859c4172d0c9c6c92f0f7f5d54a521605fb185066595031a32dec87cb65b246721ea7108a59b6a04ca67807a6c40f928a5072d15092f0ab20b620d150ca13b91b73d107f511946d35112dbc1b72ff271543360f54a431670ac83fb101ffd7b48541677132ebbf2d0c29157198c4bfd386de6c121e46ef055ffcc7d74f374edea9e08b5f53ce5476c905bde53500c94df26e0713caa4089358ae4da32e931917b19c2fd29332c934912fd598c59ca57ba06592ed0d6d1abf4dcc2415299d4855c0ac08b53014df5f6caa7ff2b38c93f4a492a00bdfede091decf1203f5777affd3f5898e3055ebcf0f6c99c9ab62422a604e5ade5876105f9c09c9a154134017126c1426a9af8f210b675498ba74cc492da9deb8861c7b89a6bba00722d844229cb148f065a5963cd294afc8d05542154a7ee6692c0b5c3383d9906cf2c97891b7c540ea887c78e4bb7841595a2bcc8db723499d113740f7e1e4db6328a2b77cb10c657c9f5067e477701daeb91ac7291713fa2e16742269e462b28a4f34500bc384b35486cce287c97b9247da12ff16d3c760734b573213d49d7b69a29c79b89449b88f1e3ad69dad4538a3373ca29f059f8970b18f4f350027ef75ccbe1dcae6a439399eaae8601db4a970b7a75f7fcb42b10f65a2eb7d6deea003a569593cb143a706fca4126f40ef749cc28260b30c454adff2840bb7f032d6ce5dfa306b28db8935250bca222a727cd53079940198a469518eb3a4cd6eececdd0e9c17a75e4497824e424923dffb9cd030a55e96528f2711159e25d61e9f7a0ff143a8d1d343afbc9eff03f6e2a9b7e699c7288dbc58daaea8e97a1f4e2417eb275b5105fdaf6ec8842f161953e4fdc991c8a19ea8beac4d5756ab0b3c2ebc7fcda55ca6c1c9c92c96f3ecde9ff0c549c81ec26fe1895dd069b20cff6519254dcaebf45ee4645e0da14a48e3c532a1e9c3ac85e18de08f29151fd89457884c196d3189150c31dfc1e6a96d2d387d014fed65c1e90ff0144d0f4e7f84666a1c9cbe84a7697b70d6836642169cf5e1bb686870368043e3109c9dc273a43f383b87c3143d387b018777e2e0ec07d89bb7e0ec25ecef22c1b9eee9de5a0dce0770609d07e7a77090bc04e76770808e04e7e7d044f483f317b0cf2f04e73fc001fa1f9cff0807086170feb229a946a08317bd3a5495f5085ef4a1996e072f06fb29df2a659fc293bb43f0e20c0e51fbe0851e2287ff0c5ebc80921f0b4ea1c6c3062fa1694b0efa7dd8633a837e99dd619a82fe195499dba0ff02aa7c7dd0ff016a8783e0b40735b63538ed43411582d3c16e0c83fdc346714614283ffb14074a32dd6e51c4279a77f7c328d273721da752b5f76213465110835804e12ed0814c05d21d86a9822e0adc3907d1ffd24ac4a2a18eb8ac83ee9587ead0a10b2de8823fd0a733646586788a04dedf24cc51374be9db70a996951733b5297db86ae121f54329c3c95cd7815a9cb53a6a1acae253b73d116d82154ded241cc45e6f897048bcc84fe55992ec60b31bc3e9f7a0037088418b0fb4a800a63081081258c203cc61060b58c30a1ee19e6c56410fd6416f979f6f5322ba0c2684762524441eb32e3d163023e931ef4c8ee34e020b921e879dc971d649a07744c8acdd563f8b767bf69af40859bc266717aac1019a92ac1b434478378425098fe32e3fcee0814c8f69273a669d25ccc9f45876a263d159eac21e4c61f376fb4117367f4d7ab6b035498fa3eef478023d42c8dac6aec8fa55efa2bb3e1904eb9301ac480f1ec9e478d98d8e13b8f757043dbeea5d3c7657c16367854fd6f048a6c749373d5ec2bdbfde4bbdc718ef9cf137837eb63fe8058c1fd199a094e84d3b15931313361b7d09754fe523a58cd1342d419dc83afc24e129ad42175175583ad11b7f3c89e5ba0477632defb069ae37d03473af8ae005ec7529f8010e141ffcb81bc3f973d8e98425a278331fd1f10919ec5c281debc7d198f42a54086f52a2e2214329861855e80756072d44150dbf0a2773b565a0100f27b928c7a46bf91f99f84bbe44182441fdcec3888df1c972c4c62048a47e38e90d792904ea74b859473111233e1e3e8ce271872c47f1f858eed8112169bb8de62336ee105dd6ae42a8f0e661bf3319aa0d0cdec44841e15a874d7b55ca50358d8cc690a8df6e1f548bdd3263059f8ce89810d2edb7db487f27a370dce9c3d45f66e91c518cc1829884761b2d475477271c4334a263031862bcdb1f4fae72cb31e9c152fd14c54a3c9c96e3acda1c92a99fcee3a9446a0a6c915094a6767c1a993902010cef769650a91e4ed49f887cd222637f2268282952ab1d43d218bb6c8c7d688c9d37c5e6c4afda5de1b438ef3fdb6e6dfe6f749da239ce0190c430dfa71c2ffee88298ee638bc68fd0a07eacc691a30a9e9821a7c46d588afd45b844ae503527f0233ade617f1a27928a26007aa410688741219e995590446db45136a1c8ed4e99a7c37678285ff72ea6a3704c10ebf6f1890c74a082a37b78ef60786a30fbf012d00016bbf577aa96621f328361ac11690586d4206d56606b56c5d6986405b636e1680cbcc0d11032859e6923724dbf1fb9641db90486e93efefcf087f087e5a273eacfa8543d4811536465988d98462b8124e818dd190159638be3296204b1edb675cfe5bc857dc9aff923156fc394220c269610a22062a6d86515c08284a5862666792437ba17ad06ca64eb48c5ee716057aba5969079e519d633db8ef72d669117a7811733f07826d571dcb46b2848bc3b34bc598d85cdc7a6a7b52234577fc861be3108d21b8a5739ce0f4587f4b1ec103a12635ff20f91eace453fe8e5132a6bfcebff5405ea8cf16415a1bb442ff24282de3ecefcf8df48737ac31ad5c9c961d1826258d48a1dd257b2dd469448ac0e038a3cd0ff9f3cfc79f2f0f2e9a9ce87e770b51bce4ae9993e39187d6da12b2b149b8da7a624b90f27dfbc38f568be7e25f7eea91716aacd96d12cc6848d64a1c88bb75b6462c8688c213643bfc90b0c044ce42ae03b0c74077c3aadb4d1f48a1347fd5a68f4a45a7b3c5f7a8d3d07ad165575e7d3dbd45ba3228d684225f574d33565cb9772a81b0f19e90db35761c92a66381c6546b7a93a420811ed76e8a7cb249e509441bfd052d21d4c63419d9ee55a445d9b222122ef07d543c887854ece56f85aa13a279742846b7f29b8e4aaf9b636a3602db2401fe361a90ded0d6397c58d73be4d8ce2f1302c3a60d581a13f912be04ee377b5756848de3e595747db78baf6ca13b6370d9374ed198b002f4c3d2388f1d2ccd80894ad6464a44ed0d05203d582169f4e5b63500456be6265db258ea788faf330fdf4c83e0bbea442aecd04ef37e8aba9256fcf3d35d5c7d39846e0a5319b502f965e98081a466b6f1ea6ded216e9fda5d551a56a05b8b3165d1e4a8dc5d0b45dadbf7271734698cf19509f4fa7ea733a552b3c169430fd037467d674bff7fc113f4795d6c80ea34681b1da712dc697d820f95729623633f820f5ee2e701513a48b0956e0338ac7b886f45ecc3c6ad3c37d1191c682bd8990b846528ac5aaa7c88cd050d382a2dba5ace981c791d73b22445c20aa60d47121505fbbdd3e3dec37a8e69db16b2090eef675d3bc7d5174a38e850cef6a32a87c1ad4889a761242241624377729c809bda081dea30a2b144e981a28b58de892f482cf09d75010eec751bedabe8dc4b822cc2a46e74631f38e1c0a6f1492a1d6641eb2198d5a30719a3c5519ef34b2a1562ac3fb84b6803a0013cd0cd8c936cb8cbacb2cb77250f4a915468aec12e19bba6ed74b7a8184cf7844dbedc47e294e13849fc4ec5bbbfd80cc17c641cb48c3ea05b4db45094bfb55669f17d9779f09530caeda18d3b73c63d2654e2284379f490f5865ff74176962cedaf0b943f439c7ddd3d1835354521aa3a891d6735492e9bc096a9d1b72bd476d6216cb373c5a23ec3d86a9a756208dbcc758cebd8c7d63fc9179aa935e1cd96d9213e12fad12c3a284dda46648e0212757aad637349537f451959c6b3c508c77925cf96114a9e84ba94eabd28f234241b59d4858208a618d046eb791f4e3f473cc188dc851cf15592cab4c15a89eb3f150716dea434b22c16e8b7a595c59c9a6eea6c4cee83da8a2168adfd2bc2d560dd08c744e216f4679da58d76352c7204c3fbe2e15d9d2c2dc1c0df1f057444160f86659565156372f27cba6aa016c9aaea241bc126b9a26daed05121a3fb8fae4fad3f6d8165c74da3651ba23382b47706450866abc2d8cb0d8b05c631f4339f717314316263f700f3098d3821c763a05c7638146620c31e1b61b4744cfd4c5cd288f1907ea5b8fe5306eb7638551ed36334c565c6ce2ac6cf3a26c738ee8cc5f84694aae15d2dc648b7b2afc38bd096f6c42c3d6aa86d153695e3ae75912193e90e9bc2d072fd6ee49469d060a5cdc6ea91f85326cb7cd6f91e0e45ed59a9a7766bb456ab98289c6e0f4eed1b1292b0fc6e5ee2c2ffa9d7c073c390dfa3b6d6ab7df41ada6f35229b289d611943c44c9891adcbe774cc196f3751a4f523f8d1759124a2e5a18aec8bd62f1afc9a35a590d5ba3d4c4ef6398a6ed36ba2665d0947fd3c8d87e239b1d28d2f72bb9f2532a65cc66a99f6a1cbd15214ba75c2cb65b3e8c10861499a22ec9511feec8269574e92ad2e32952dbd9678bb547bda139f15df90a12e1e19d9f84a9fcc81f28a1506e2b74d9cad7373df90c92b057c4eff5f3b1be3c224411934b2241ad4e0c7207760d16763d0d522935ed0a8f77903e016cea55b043a646a0d0071b3696c11eab7c8053862b3f660f611247a1a46fdef015c2ba995a5779b8e66ff9e2b1a3b6510b32607a5daad683e401f325d73dd1056a9cd29602fb165a86d6dbcaed1ea5c86c20601933350841551a67707c65b6b7a14be38fd80ee2548f9b8e3930c42a5f916b07519c2e794adda669ceb5c26014736fa1a396192addd24c7d192a1984502c81e0ca5a0532c891c8d141c5e80ec35d55dce0f27a8eeaa328f1e905678fa00d068cb0a9eb83fb03385c52d07fa9d8cc06a56c813ea3b3f1e8a5b670b5969c1553ca4d942d035dc67768f272fe9211b6dd729044aa1f415aa9e6e81d73ea8bfff8fae9c6d7e60288e2c01c1843c8488c70853d353c54badd3a318ab6a4fbe4cedaff263c8c3c631da318179e494f17e1852cd2dc4b6a8f6cb9f1ac8e2bf9c63037586696a54bb53dada2b169fdacd0528cd021c2ab392545c242e9c5a967d767e0dd180e4ac52de2345503838799e220f4c69e2a3626d5fb8911001546bece865bb6734aa46534cb764ef7da6936da16de6e1b12d5ce7bb81baae8fd6ef8de1b2ee79e29570fad2ac50b05cdad94a3bc579a4d9ddabd1ea67aa387a9eda05d4259ed785e9cdbebba65775158c35c674d14d60c0a611bb4a0eed9aa2e55d49ccf764b5ff5f647e283e9b4650e3c7516b488a4491808c290412a7b0ce9f6f5094414fd97203b7d0c6504ed48a09d5aa48e2af67907b8db87c131ed2ae09ad0f3cf379b11e93015aca8ac07baa23282e675b326218aaabbbf5ff7a5f4121aa6d2938fdc54ab91a390bb4db9f0267cb1d47caa9dc97c3415a35b1d4f3d9a2a2c88ecf48742c7082c8fb4c08a3b03281cd3f78abc5b16ed3d927abcb65bd9346806eba3c2fa4a37bbc0fa9bea506a094338997bcb50c8d89c6a0b6672a6991de1c979c8bc9eed9e367628ba6745ecba332acc091df257b423b51a372efa258017fd8a6b42f6ff1ac4150501ea6190a45f8cba839ddd3e38d859b557b1d294577d35ac0df870a0256a0067228e2a28508e513c457d42086db7fb46566187c06d6c7c60247b43fe4a96eaf090880e3fa643f1baa7ce1879a74210ddbe4ac0c0f7523a8877fbf89816742aae5ad1e4263a79b7b75bf127fa7e5ae9bcb58569eabef929c4ac993b0a99bba7e9eda11c05aa474185adf8ac94a0a6243ca6c712a68477e263da49877a141cc20dbcdb374918e2bdb40e8af508a9d4703f55e543a18638964dd47e6a31f88f60af1ab7fb3009d984469e149456d119b839a62ef9231a0035e8dd33c35862793fc7725eca8a6222212483e31832f557119aa23731842ea58e212bba236a22a943dda9d38e9252bc26057d68d84cca6568752d0d4b30324b704f7156958ee99278595287e1611348a90174a9ad43663b0c4487e19dc1fdef99b94912ff96512dfd52f36783b198246afae229fa4eaa61327e8d7fa70dc5e4edd6fb071864a71ad90592101f4b8bc2654fe2631ddfed97db86b311f2bad84eed82dc15b859eb3563a8f79ac806b674ce794abd7411260915debfbefdcbf73eb802fd2414b37c97a863fabfd8bf2c5e849041da7063cb7ea078bb3d1b609816c863488134a4a098f2b01ca4895926d3842bf2793250ac4844fac3e8d564d8e944b85e484650d409f1bf4b637a696964660a7c2a633c45a9cfe84abee3d97d42117e65497242c26151aaeee592184824313c90252124d96ea785e43981a5391eb4dbd352329260cb152b1ad9ede30967326619d50d1b3e0cf1f794aa6a9f133752f5cccacd74cc1c3b1d5779f2f53fdde597c0c228a22290903336012f3edfc48645a0410c39f17a13b35b416930856528e7410893584cb22414d7a620016a7b508752b54b042930ae7b1c4ce0319432fd2a059f85f2f720017721049151eef27d5e79e8f0d3da3ea838994ecda507ad99386c1c9c9b02f7cf1587fd8cf95c2e656859991a71d50b1db544de8592160c287df43862759332398f533fa534aa6adead425f553a8cb8c7c8e05843ba68a6d89503f194b063d691c772f8388f138ae86bd2df6ef5265172c4c77a7da4bf0989ba031348f80c517c422b9a95dcb8a0686aa14623b433e80f7e78d91f0cfa671d445fbdea0f70fb6cf0f2ece58b1f062fcf819232d046a7a767e7bd1f063ff47aff49ff93be7efdbaff12832ae4f487b31f5ef44f5f9eea32ce9f2882764ecfcf7b2f4ecffbfd17ff495fbdb2059c0dcefb2f5f9efef0f2075dc2e9538de89d0dce5f9e9dbf789937e205066716000d5efc78767a7e767edea6f8240fbc68d6f83824666f1e8e69dd28b97226b3e8a3982cbd924bfbae6e7fc85ef786dd2ec392c46669337d92d2ca1ed08a373a62ea8b8d8928e6c3c5ad5cfea408b8dd6d9df2a52e5f629197af4f6a5c1bbf80fae3d4c481218e8779ee769b213aea8d8dcd524cd8762b0c2fd7a0b837a537d82a64a9e48b2f7ab97911a7a9a7768b452827f3f20c75f9f943e0e9d6e1f26a7645ac908bf58c302ee090ceb3e934a181dc1d90509915de1095dfd32529704722a9aa27d95e94996312561232164fb958d462676196a671c8486c95a2cf18213a21869c002d2591bff9f77416b39f97512829794fbec16f3e65910dff443ec31b22e11311f09bd674432e71fdcd157e19eaa520861acc411f69b0f58b35044962f62da0506a0603e62a5f45155a6ded4f404f0cb42b056bb054283823234db23601a28587efada45c92a8a2344052cb5c08834f48422bd383d1c23840525fa3374661f0b5d331006114b530860f461bf713c2202bfc6631da1f2a5adda424fc51ae6acce5cb477da775cc48adacd6cb86b4c2ae6681e668fb055e203912e362efb58a2ed504f8daedc227c420d7d662dde8a35e455b68f0296f85d06ddc6e15df0e9c4488e90053cce3cf16381fc1db5c210521121063a04784b0763b448a01843728b663a6ab8d2b8a45d708c2503a77dbcb1aae98cc9b3201276febe23ba187986fb76b0d82377cbb456f1585eae572e4d6ffdeea789d8e8a1ceaa23a31b08ea3593bd086596d2a73f00b3b5981bee751d5cab9b684477d2b68e288c2adb1d37cd5abe002dce6c6460cfa0ede163a4f3d43b9aed3a2b27658a1ca94565309ec35e9b5db36e896884114d0a20a2d9aa0df20fa04feac1dbd85699955a56fb747a2a635cdf1d89cabf6c4b7325792e6c25b6344c54bcb4aaace29b921272e845a4ef9ae9651e3347c6c321cd8e98e34e81715f3d46cea42b1d9717b20c96dde68a6f9798629bad517078a02efabb89a0f8b28c6b8516758f4495e5ce7226c50e31b5c5582653d57c57690d3077bf981365c7ea0233e8690c4aea96aacc733c8e3742389441f46e118625ca80e1dedf8f51fad521be23975b6dbb68ad85a0bc4b8b1a21b843765e81bc29b771de2588f7e56315dd2d7b789deb5db5f729bba5ebb8d7eb32aad42cdf505430e407ace08fe5aee918e25d1c565e0a8af2e73273887d0a262a4a92d913ee043666ee8c3888de478ecf4b9a8e8eea98aacef1b8d86eaa4ffa128ce2d6b4709dd6e373b68654c1d80d4f1e843d48a8da67ec259ca13ea3f8682554f4281f755aae3189b6915467195bbe7f7cfbc7fb965fdab760ffb9fece7947aff5a64898c7551fff2f8d2305e2c95348cfec95ad0d27f6eb8a48127e75450554898a4dc3333a43a14d1699825d2bba7f3f021e622f0deab9630fee8f1472b55d615fc93c5a9a7ba1247541416ab8a1d0cbdb219defdba2812e9cc349ae97a4d6fb0dfc240fd3203d1fc58d14f0c25b7e140697b0727d39125d21f9afcd35494fc170d2aff60b3835b321ac35bb2d9c157d28377a4071fc9af08c3cf957a2fe6c1037c51a06fc80d7c2237f09edcc04fe4067e231b2bcc0826608fe3c112ca837ab0b0010d93e4dafa20828a30a74181fdb5d0991f04c989610919ccc031dc0a3ec29ec57570efc6058fe030a7c17b2818d3e02798243414c10aac142258abafb2f526ae503c4fd16f1818c2f0dbdedd0197ebeaf68d814ccc22bafa342d76a83c22b701d5a2c77c013b5bd75076481f5b2364cd8d165705f20af6ae16e8c39eb6e6d25f256f67c28611ad5d91c51b6b3074915b175943f8c086c9888d1b6fc9ea322dcdb535ea8d9339b549c8db24f64e9d85d96b6e7c8a70a7f5fffe3ffff7ffe5b53acc89dc53474ebf4f47af15e8df713746cf829a2cbadd224a363b0c4c935c2d33657a0e9aec557373abbd24885de35508c911df6e731a3b92e32342e26178a18fb10a22283d9f9158ad7d6dc2aa7fc05828ef9a54b3f6e0f61d3739f41c2c794a8cb84733b5264ed087cf0df1fa92bb8935110f34e1fae6a813a74dbffa7b8b80b6dbb9ecc9316d358288558358ca5f5d507f15f44ca1eb2688f505f5d7414f1d9a0e9572419f28815db0a0b77f93bc3630f6c678c3d05453cac1091b06276c1e9cbc88ff85c363207e6f82f8fd82fabfffcf0ee0c1f2e58554c35ba2e6c61a20fd8d4e24178328e0a0624ea320b671a75110ee40b84656a52116a91a2cb9d3e1af483e67fe2aa73a79daba4c5b13b6abc83b044da924ced66207c2f6b8b783f83b1a53e2cc1f6e4e35edf732ed772277107e7f53ed2cf4f29b004f5fef6992ee516064996f39da104d51bbb91fb3940af98647314dd1120f59b73bc494e86bcfaefda5b91d35b12d4518e6be916ba8497eaf52b411b18d44d4de2961e4a138d4a892173980b9115d78c7f34f92f8fec458246ae7780eb55f2d79aace88ae458af5890761c3b6306424460c36a6b46b731deeb40726fc96d3e934f89176cf6026c28758ae836edf1f809c531906fe8f1089d002f9bd81f612f655d26530e8edcce69d116659adff330ba35b41e9765b36e2b72c8ca4a0f45e3bb22b40dff08c45a906345dbdd7112dad47b230ef4438d323e98045795c0bc3a48034767375d8b48c6d618888623b249d6959a20346b3848a0f454a0b43e234335a3ba065640bc352f1880feacf9c6488619891142dd5f6b1205a90b3260aad60458e7af0487a704f36f71aaf8225fc66872a98db69488307c82d51030675235369c5469444aa0e3f9f86423431cb1149df04b3c6ed15e3c503178f149c62d61de3295be432bf0bef947829bfbbccdc3abf56b839c3258e546799735bc07650dac8d72b2a24424b977d542dd0b21d5c94e68855f499755988c767c56a552738284ce7832af128f4aada66a7c1bed91afc8551a4a5219e9942753ed234c1730d2af7363ad96e2349baf63813ea0d33774812bf26bd8b38e8f61dab9b87c22d40a879ff5b2ec3e4237fd07e9c1a0e0a8ff920eef5ad3a8c0fee30e69cf9eb6eff023d5486f0a8870373423386b80d772a9a8c6467cefd8be2ee05b516af6ff8aaa1e5ab761b3978bc52673e98f9f77cb583aa91b19b59adaf5d41bb1a5a52dc8ca21788f916905098fbe6fc9ca24d9e9bee0c7f838302706729e1b3056bb06ab126a75ba88ed9ed4a3fad0cee3184e81ec37d8dafad12c660a01d49d5a85030e8c31e650c06033840db82c12954f7966070060df432189c3fe1ffc96e4141bff784f32687f2078317bb310c1aeeeb355c0eacefdeb9929339bbb51e74d7c8c45ebcf878f98fbbbf5d5eff7c05623f8a17511f6e6c54b81735a46a5bded88d6d44c7c3acd8f52f5066b99cac647e20b3dc4d19b7c601722088cd050e848d5b639b7df5ca90051b2aa25f737d71b516bd7e25b474af56c8fa75d86ea3b088dec5feaa4f24c4fe6a4038c4feba4f84fa1990705f515fb7eb381b281663b3ea073d58ab3fab81fa1a94f6e79b7bbe0a62300b3610a0896be56a84aa5f57db338dd075f75c32f2c41d811804e9694fc3fab6a4bdd8544cbab9524cdd2bc5a243e8281bdbe10e9dd07a284e4a2f1d61f9bdd317370541cc5ff53bcc5f0df0c90042155eabf05a8587c6604dfa2e0b950fc22a101d6e54b529eea627035807613566a7fe2b0fe7a55b33b52abec349726e5ebf14f12296f183b6a36cbe57eb285684afaf9a51ecd6dd5054d0ff51b5a3c154bf6975169e33f6784fd1c0a40e19918af7ac3091bbfc0adfc6a28edb819caf5e7509f38b6cc7b43861fa2bc861d60761d6258d1588018751ab806b8d3170774c9e22676a649ebd80502a667ac015ae1bbc85ac40b3a1bd2594e56c4acf917365a5562635dafd296127e6fc3c4c9d8e77c8f438cdc7079c94b59bb21e1a232b3727446e700d09294d4c26c7934e741ce161a2afc9bbd9c8e424a9d443a29344cd343bae941e5723d6608f831d22ece7ba4362e01d536d789f2281d5022d82854e10f163de098f437c92ed0b7a064f9bd6175edd1cc15c2996cbcf9f563b61c5721385124498c0238d6773b97fbae7173ce83734a7c10ee9cfaf992602dc74f0cbd7947b7e1ba8f35be580f7637e3e8b1b97996d901e22558b2fb93a50dac179d5bb6015621794b4937033b75d996f6b36666d63d6903ad8151e879dec38c34385fea9de9f90a85a45f9e7f8e45cad9603094dc5e56ef8d36e0c13828ea899c8edd67e383d302364e3f1f1f4243da676a687325f4d1d32390e210fae5530035ed22295ca4bb23339ceaa5c5c0ca396535d0b5aeef02992137f2fc969707fa970ed3b3c64e5b445ab1ca9e6c07a41df09f58381131a04a74ee8b4a6542f7c15548a23b25a2091d5228934856af58d2e96c8461f108d4219321b2d8a9baaf402e5956af97d5ea31318b881d33c70cfa375fead6590e6e71ff6f717d2d3f7a4a7da59975ef00afd9744e594922f480f07c84837a7a05a4428864e6701b4e645ae3013d3d7069696e6f7604afa30213d6dd4aa8ddf47bd31590fa796b17c20f16832861979d04d1d4ebb0abe438cd1c282cc14773b9cb5db8b0b24c9cc2e376a979bb0316b1bb3cecdcef5fa90c7b2238e8539f972cd53d66c60f355250e253415878191e478a6c7efd80ce389a2d4c75c9371762c21533f02070b5de98319f213f3eb34de44fc524df86fea037a30f3dd7dd0d38f4ff8abf905523d7bf89e9ea107838eed368a47d198d8204c3ba40f5187f43198a87e15a2bf0f31a8420cf6214eab10a70e04c63b5ad2adb064873a24abfb54d418fae461a8888abfe77c0469c9d31881666a2499f64e201db19cff9e9481f5706a8f2c530cd3d7b1ea9bfa9cbc32e79b0986893dbc4c8c14342271574042c2aeb1918c5e271721e19d288889d0ce557bb0261261589ba52c606d17730c6bbd9c39acf3051d022369b76fed6fd0da9008d53c2be1cd90b6da5ce39a31a93e6c1452232b8a5903c5c3a3073f4eaf164bb9467858ca548cc3cc98307d831342c2cc1ad7c619ea2b3f5bc6b578eb30c21c3121547f713ea8a7c3886f72a6ce457748088a2d4ec706a78f27b024ba4cd5f36eac86021f4f86f9d1d5807592e2dcaa213a4b505468678c92a7af7bed76ad2939073bdd4b31e47a67072786ac18a81842bc2b3cb9cc4968316366bfd6c3d81068f3d309f50fc4965cdb5f1b7d3cb709bfd8845ff28499a59b3dc8bb078fc5b87456ea40776fba0957e5d074eed5c96efefab1dd460bb5b656e4111e89cd8661f6facaa4a8dc577045f28c86f5b82602c5b0c0c3eb0bdbdb6b087180ae35525e1ba45cc1b546c57bb8b6c8f908d739525ee9cf684d42e0aa28b8c678b7dbe93bcc9b1d94a2aa7d55549e74517c050abbad0caa015e275cd8dfc0ffd19e680f339ffd973f9e61981a5d8442652d70d721a322f92ac3c9372d573791e9d77051f81ab04274dbb65c54ae36d409cc896d06cc5474b19087c50331a50626086146e517ce9b049deb1dd4542e410c56f6d624aea317a8412d68dbd86ea38414210c0d90bad1ed369a13fb9d8bf50af161626585f3fcc05f1dac60a09d02d7862a18681ff37a8c83c1cb03dcdfd33afcfcb682aa460daa55ac2d3f44ab9a6fe04299a8eacbcf4686fe54ecb21db524d95842d73007da915359d90ed44a6874b6503670e464180fb57970de18db121c1c807695f49d4eb5625ef7cae124bfee15962365c1ddae5bf46e5f7c551d45ab6b1c34d81a348962ca9e17675c759060fe4a9dfa9cb87597f9ebd2c4f4559f767f6cb785fecdeb6cd06f36d4695b5cee263ae870d045b85f0b0f6ae15327ac0974affcfe871bf8250f6872d7cb8fdacbfc3367a84dc890c05c6b7bfa8cffb6efbbc503153571e1cf9055eebfb0bdfb2fecd0fd17f69fccde7f518538f75f58fdfe4bb508e6de7f61fafe8b2ac0bdffc2eaf75fd8a1fb2fb6112fb07be785b9775e726aa9b8812662e75e7f31175ea0641c1a16b244b8e6aab044e027ef91c8ffd67b2475998a3e79d96bd8ce251aa12fd108cc89691e129dbe56988ff818d41fe73a4d0c0cc54d97688a2b2bce68597eda5edc69bc1824f23ad9fec59dfc62101f3afe211d9b11fbea9ca83f62c7f325f3b4dbbec64594593f239a474911c5f58b6e996bf336ad0294c75cb28923ed9aaf107b94ea2feb8b0a3163f066c215af0da1538e31970b724b7bd096d1c6d2fe8f946dd8687da7250d466330170346e31da40a63639812b9dd86cfbb2cd7d72a3906ed19c6388c89a76b9435bc6f70faec2323f99ae156395dd8b6b22637c7ae2933cbef0d1ff2360a997ee971d8523d6d1142c20b73ef006538907e28a5d0d76277fb3e9179edf292a3c3dc6ed10389d1122bae5d9746312c6b178e543f6d8670ffd9912558d3b06583f4a8c8d6f4fe48534e47452d2a5602e1724959f4761e27913116a85f5cb2900335343507b017da0cf8881076b1f4532a2fa514f17d26e9cd57642445c070b0b48ddc4fc5b054c9b3a69cb8f972d27e13f66a4ea1b5d237b8e6824e5b876aa942d5bd2e36e8a297bea42bf99633499924d414ea44edcc8567edde77df43125edaa75dfde2e11aa371b64f47dd7c4559fe4eaca73573c5433c5537bc0fe5d41510e4a8074b8daa6402f99492292c35ea91084c4349024b9f3322d5cf744a382cf5baffca336d7708cb1ab33ae18b659cd0d274ca46141ead0a905bba5826a1dc07bd93362537a30aa3a8ab75dfddc4e26b0b43465a732997c1c9c9e3e3a3ff78ea73313b19f47abd93f461d682b429b9fff2e5cb133d85ad52af9f3730382d54f27b0d094ecfa0a919c140d1a267d4527823c5ba38fb688204218a8defabf7822fac6d3185961af293d52269e162ceed64e3dd44edd888150fc635f8332ed6eb5f568b84a5819ae7a746c9d3604f82fc45bfa4a0b90574f29faffef9d839c1152f9572d41b17fee1730a9f66f7a914a80702775a5eabc3f4df225ee0dd21531e3d285ecc9699f4d46804b9e31dd5d68b96755a1e1ba489f842c3dba70635b2f8fe49f592bb9e69ffa4159c6a6b8c4a9ee0f45c4de033caace79d92e74721730dd4e5021df2cdf0461bde54f79a7d07beb474ab4dc743e1bcd7b13bcc1a52cd5cdcae971404d1ae62b6db53f5639c271b59d730f776ac69b7be088170a1eff42745acde198d5e3f75f5fa1ca5a34c3b168ea7e8d438a43186fba0df9c32a4322d64904e9c53e4d42d32465355a4bee6b56bb08aae4e046bdc3342a0a3d45a6d7242fd8730c9a8f1ab6eef65718bc2997d49daeee6d44ff8244c6ec2058594c4a3fe18a6242decb15a7e0bbf328f234cf719eb82967a934c08ca64b22ef9eb345b2afcf3184d157f7d1fb32866b3dcedd284c8513a1e4e2eec53330207268a8cc478b7dbbb1551c52233d77f539d246c148f736bd532da99744e44a5efe590a8de8604c5b5eec2ffc6b423edf022ccdf1708425d0fd9f3616ded4e4f361be4772ef06e7762d9b3a7fd42e49b65933ffc779f3e7ed6ebf36253239001df05fab0994354fd2deecd4f01a70e32ce9ca8e9586bf983a7a8fb948b45f1b6265f5275ee4933eae94b5b87dfd0749ec2744704613b024f6b098b57989d87adde96af3f73302f893851719dde1b9a94b9ef74395c5a58f1a35179ed23b30f80552e218748e2da29c161535d06928ee4b84b2bf7703456da0e7da3eb80815e818186daeddf364414fb29172a9b7ef447627b8828c5a0e5a32afbd47c1f24385343fe9c68ceb630a22cad5a2842f5191ad7ddcfd095af5ddc843701bb28dfaab14027481e23d9ed631c0c8e9f486d72007ffa071f3fc9cd926267170e4bafd03f7fb0be5463c25188a1d1532f67faee63bb1de79fa8883c98e59d08672687fa4279d41355f0655e035fa23c0a83b09eb063ad914031b111b8dd46b12fa85e89a8f0609da75a2ab7298dde6216a916dcbc137c597367312c8ceafcdab3dc86f1ab3f0eab26e2fb9e26d15ae60cec1385a40709e9c1921cf5e181f4604ef6cde77afa666ce91066bbb56cbd662681facb7046ffb1dd9a8f5f2eb43443c769de4b47e200517f92c494490d693e7fc1fa667b91d2a99f17ee79b4f6d389e049724da7722fbdc6643aa0ba6a5bcb53c5def2e577967aabe67ec4408e7730ab5e64117823db6d85dc9b55c0ba11ac03d14d76faae00246aa52c48d5342d957cf959f06538d3af035fecc5201c507f12b2094dde64f7f709d5c6c9eb5a314ba1e7e09db935db6ed76314355f3599f569cff447fd1d3c564bdc9b5dc5d617f303e5c4ede09ed40dc2f7322f71b53aeb1c413b04f4ef3329396bb7ed79dacd68fd185910c7ff4754e20a24e504c384505f866246a542ae544cecd401d35238352d6a52d49470fd5cc38267a97191008f95b86cd9822b6c3cf7a77be757ce529ad0894c15a5816943ba5a9826f5c9bc640513179aace0a85f98c7c3d533b3c28d4fe8bd5e1491b61b4fb721adb5610a1323ae17edb6d026f6d715339be68bee19de684d63a5816c0f35eb310803f3cdcc1a4e30470f1044dfe1e044ede2da723810a3deb8cb47bdb15a59a3befaee8f77434998ff38a734794713ad952c0327a72f7a01d36fc3c6c949f72564fa598318ef767053e9d551d66eb38bd623bdff169b5ba3be7dfbfaa2e1655c33bcba9e165ceb496b827af7e9e34705f855938e1c326bb78f58bb8d0e54d624d86aacaf11b0b14a0c19613bf856d327590bc962317559fe858f1b633b45ec2f45ec2f0eac1bbb83cf75d26056bce4d9645e38aad62f55148eebf3c4516f3c5434a7a81a9c827349d1a0b138435cbe21b72c2803fdb179e141be7ab810a4db0fe4eb076d49d2c790210a425109376fd1827553f42f3b0c0fe51b1fda38fad74abff5a66a17a5ce6e56ea675c89a42c6ac1afd53843f775747d455eba3329cd18eaea2122d2a18df2cfd0c6e5768b96e4a86709e25ea3d97e9bd95e93f10eee9ab69c261cb8b8d4db4b39b88604364e70bb8dcace3e3c39cf18ef4a59ce81251cf147d6827b7df0df83d06569a2d8823b0c1bcb5b36e9c798d57defc0f0934d30d281513c64138c7061f4126e82ba519d376096d174954a4f9110a7bf8d40b52e7fef0ef33f8bdf37460ed5702ce7561a665eff2f78b2e2c17b7b6fb580b074f4039bf2aa38cd244f631659cc2fdea828f8e903650467a7f0541382b33378b686e0ec7c3786b367df182b153e4c1bc6ab651f93cd0ec2fd37c3a5afe7e01d7f64f5e7610985d05f91927e86feba08fd0236a77d741d89fc06456c1ff0c9e581ed362f8f59c5276210ea3b8fd814f373f5c15b999f7e3e56ebb0ddb1b4be56952243c5712bff426e2d1ff943fd15dc523e24493c126e798a132f8e7bf917629a352f76b6d05fc1ba08ffd20dfdf50e3f397047bddd0e43edd0566b943d183260dbad3dfdd9b827f0fbeff4fea7eb93477a3f4b3eb065e662b8c5cdc310c18bbec2ad6795b9f5970272d773233ade318571b05984ab7f04fddee00c16e1ea17f395521a05ad775452b188599cca78e2198532a369ea2dc2887a0bea455c4ba35abbdc235d8c9876b5a9b90fedf261cf46f46044611f5a8f50fcf86607d386bd4571885655eeab7e60c5263a11bfa8cd7952e381a8bf7ac5fc555fab84577d42fd95228eabd7cc5f0d4ce4208f5cbf62feda40ae15e45a47be66feda40ae073a7207d19f762a9454fa1559549a2a7a3f41360819dec1d23553319aed9acca7dd4699ead1de1867aaf50db1abc1be796ea63ab5175b557e276ab37fa8343cb50da7bb9a2ca174bbd51b32f7b65d29bbd2cf9ed9d7e850fedc9d749fbb4bac89170eecf28a46327ff66e8cad33bd43991f90492f32a7231361c433bb66057f5257f03fa888ca937f730c1b91556f1e5af330ba5447f0fa25fc5c9d69a8dc738f12658dcf0251f75920d586679f1b525535bf62b4ff1e94fc8ea797d2f23130f3ea925a6db9d343c975507b3ddc3df58454c5ed9e2e51bf49b8220c84bf2652617c124e68add985087e7fb9d10b342514d4e81ab3caa9e6ce9b0970ed1a557cd892b5c64f08b588f718883c36387bf9bdf771ce9e3105a9398b2ddc5156df3da97073e6e153b68ba78503b984cf50eb761ea7de82ca398f6a3ee172fd419652ef6ff14368ef6a239cfb846b61281fd8a65690e318d770963f706482d369253c8d052de5381bba9294450db84e15fb1ba8e220558cb22e6917e4195853eade05e4d25f49a3dcdd756975f6b4eedbc83c1ab43c46d8b1dd1e59a947fd4122163ec433e3b8217f98ccf29641ab05d6575fd0eab576d61b872da7c8e76729159733ca64ed2978464e90111fe091f7cf93311afdf3d11f77f00948728254fd214617817f6c2bc1173530414ed0228d29f6ca38aee2f8ef7192d8cc179e7808f2747c71a22f22d0159d685fb3b2fc14e5272d157113be588632be4f680bbfd2af151450a38266e403128ffae3edd6199678345011bdd6ae493375f6b4b6bb66c8428a29cbd9f78b30d8701670fdca75bcaf8f2e84657bc7c2aa2bcfb806de74aad239acaa56dbbf6749e2f077c37af7f64082b31f5597bfd34dbd91d46b25399f4e532a3f8782328923eeb10ec9238d78bc0cdff2a5f5216f45b188925a0139ad31e2ef3d1dd0d9b3feae1dff2e9b054dd3704683dc646246a5fb58119f968f3b7a13ce6418332aec422995057f8f233977a4fc7f35f7302d6e25742a831e2822d18347051a30986b909aa6c5f6e059d7765a6fa2dfb581b4c031639c469d94ed56fbe9ad40ab38a9e3582d8e69b3b53cae2464b398492a52f33877b5b1655270aa1afeb4faade0900b8ce78674f2dde1d7fe8a95f68c46a9e2bb5071d0db6deef5ac4f5811580d882c5306446cb7bdfd19386f3820a30396287513c4ca06c949e80bfa5b465379c9e285d6a6bc17e182aa7335458a7cb9ae845569a1d5b4d4e03906eede7a50c3c9b75b86ec4c151b30c2b0d1a32a41502d4309c46e573d7219ec45b9b539564cfb6dbc50243d7f94365ca11ef45f7411eb66581d9a433f35403c93c8e5fd10eb28c6a8f4ec9d11d691206a2af6d0d7de38f312a8f5e7af1f67ea414a46ad45da82d682ffde825c260d2dde1adbe7579c9defa8baf35d989fa009825ed06053363c10e0b622103b6b9e5a0af68e0ecc5869b83a25a97926bf118e84a369a7f5a529a93586e6d93579de36a4b4c6dbad9378a0d89d638fda00b0dda2438d95f84093749ec6b6f28a95aaa8ae5785ced8be353f8f53689a9359c2efc3e4c2fc34ce5a4a93e985fad3985a9df5cdce5288f3a7250f4fd9c9d8129fd98c2d5bf47d5bb105fe5fb8119f7f87d97693a465cf38f6b78bdf1caf59af492f68dd739ed0d0b910f1db76fb5b75d27f223f157ab68a321b3e914fdbad1a864dcd7703d49d3bec30bc27efb7db500117db6bf0937e96bdcec60aca222ab431480b6fb788f94e0c39ea61a3e83391c4f956f4fe6782defbda12f263c8c2998a4c31a2f0be62798c37efcd53175f7446ab162c2a69b7dfbb4184210f5bf33f78ef5316e599dd87128a5dfa1fe4933d8ab7db477f83441dbbff517b35fdcb768bbe38079a8ba94b70154bd5257da0af7a39253f2a1e5866bbf23cbf838feabcb9848fb8f21202defc7dbb45ff20477df8e2db3d02e1ca4305e6acb17fe3b21853ab433581d7bdc2913925bd217de5a40d6987f471de67f77583dc3bc227df9539e853c504fda4762244fdd5a043fd551f9f0c40a8f05a85d72a3cfcab650bff4198afb9aa934117c9e3bffae9244c685762c8217e21cc37fc96021105885013a6cf616fa96264de1a210a2a4a2e4bc0f00b39ead75e31b796ac7e4d60618d86de17af845509847ec2fc7d2e9d36008dcf0998925dc1875bb27d4b94551f0e704a3600557fffe60a216a99bbaf0efafcec5784c96a3deee999f04635c915ec208ae1936fe53888825a847f23473d982becabeba01ce1caa131fbe4a70df120fc5547faab133b7120fc7547faeb3c6c2b4d4ca555a516deb80d641ab4bfdbe1eaa30478b33f0046175440dd68ea10b3582ae4accae5d67b84a22aa67bc4d5b7088a39423f61f74d82f2729a16240e73d121734587487ba2be527f7e69b71708e3207f62630ff45a41add41f63c4b22f9cfd45514e1ce4efd7d44a68b79d228a7a2b2f20386e7792987dd3d72f6cb3a95312ae0dd02392e56d0ba7fd4fe5b9afe4295b5cc9a3cf752de302de53842bb758d536a66a97a291efdd7e7af729f03ee451de821eb56a6f36580b357b27ae2228668aa61921311899efc567247190cb7c7f550d9dbbe4ee0ee1cd0261a8d0c00f086fdeb4dbe88d63a8f786d4f0eeb62e5f8d5a70e9a4bf753dd4dba950f473c8c86615c89c34c23a900511dc59fbbfe261cfbe7f06f4a2eb0f027f50f0f1767591f7e61709b57cd486f51ff973ff2aba05c52ab41f65dbbe22bcc9b47c5ad034fe9d6a6dee0775ca40da73594b61e01b12a915f526d78e55c5c1ef7d29429626a1a45f688298bf02e6afabedd045294a8875c9c644ce94bddddaf24d0546998dea6cd35bc45ef540ea02aa2bfb0ac32dda13b2bbe3ff0ee1cdef6a2f5570aa6f99992ca7c7ffa163307cd18675a82ec4770f967b184ff1aede26175ed12e5819a84fbe15cd230cdfecb9f02339ed0dadf3052db4f819bec01bf844989f846b9e49786f5c1a2ce7f124859fd4eacff930f88d9417fdb49b61114e64fc40b7db4a1074f7152101cd54280a0b7f577ffe4a3676270d7a6077d2a0071a4b82fe0efe8370b4d915f761eb7a0b8b87bf6fb748f1623384e1066150ebe82bc2aada1e8607d70aa176d7fdbd7172f255a3afc99823757f07cb30abaa31feaeba904f922e2e5bd4012a3c938231f3d5203e4e50deaedf395f7cca9ad4296fd1510f1b800fac39bd6fbccbdeaa5530e562d100f5d71d28f279cb83fada798ab9e9d29c112ad99c2e3b2e56b3de4e73d62c9ea40d15bf37ef7668446a48fed4a82c7a67b6e9a0c90accfb0fdf46e4f627d3e941c0e9d4817c5aa5924be12b3a15ed5fc8ac82c242e3247d98e51d36961b5945d3620e3caee1476ad3b536fc245213599e320cc8b452848c1779c2a49230a3f25d217a340051b5f07de3eb27ea0d4e7f84037983d397f044bdc1d90b68686f70de83c323119c6bafbdb5f10bce4f9f70b9ebce40d0efab43ed733a9022408b0304472d7d75a43803a998590b9bcbc3adfb6c3aa582465db352d5d1175ad19a858b78a21ff1a95dc1a53bc7365d8ba672df679b1d44644f3d5e885f5b42cb486db57adf6d41bf974798cdd78d99c649d282d6bff57ae180fed8aaead3ad5d80815cb580f9abee799e73adc2ebeef99ecabb6c4c12335a342695827fa3aaae972f5faa8ae67baf1f1455f5755d454d3ab8ce83ab410ba493aa836b5cb542d7fe4ef5ce2ca8262691aa72519a0ec1daf95e39df8fa47ad065f91cb716a114f10ab53ad34e0bbc9efa67be5b9d4cff4d3b2ddc1a32db309993cb1650bcdb0d25a1d6d9fc3dd914d73b9a769bc9888e8be7889a41b4a90ab0ba12f8d0db5bf97e5018d5ed5d6c7c26e74391f329edb3b7ac825dd76bb160f302cc1175b8047a078510a31abdbf9bd468734628a484c1a322f1aeb42508c165e3dc6cc5d5badc0ce5ebdf7efacc63753cd18abe19956f6f3f2245a0f7217c8316c5e6a82fe03d50a178203ce4fae90eeeaf89006eae2d1e0406058cb8bfea86fe0a1fc77ea83322eeafbba1bf563111c43eed10eeaf20f6a7ea636defec95d819fba1839fb11f69dc54f9cceff41096667867f9a2ef1b1bdd39e1af4cf7b4afc1fd0e96a3e70e8bb9b2e814f9d1b41e97acb61a085532b6ac3f75d3ba2ab1ab52217426c83c37b64cd628c6c32909fd103212fa0a23427f6aaf6a96231556462ab42315da910aed48956605f5019b288650db54c0d4b27e5fabe3873753eb7db2a41f7d5ba3673f9eac8296559805a34eff35bfceeee621b1c2fca63b5cda645ae2064359aaafebd0763b3785cd8bda15afb139085108501ef24721731a21fcfc690a22edd39c84426eba2580991bc9d626549fff5ff72e58fe340c9d72a14f788a70a752370207acd23d8141143dd8a32ee6e4692b1cea47456b3d82c24eca5e4283fce5b9a61e26cff4d07ad79a383d3cd8d83d8a698fc9dfd1d849d15847d25bc1b15cf2e9c5cc9be0788a2675d1352d246d6a73192eb46567de197f050b6ddc5944ac6189182cc00881f02eafdabc8f77a8ea48551d1dae5adb33adab554f055ff82b5857ebd7b16b585561a55af5ab2aa4e4fe1ae688c11ad4b15c1bb4ed2a8786aa97bb272da5da6d242f28923810441de974395f1f66071ce5c9d2482ede7b69a23c0038578b2bcc7f7122089fe5dfbf8bd1dee3718b8a83d381626c9ff58b40c90451d85016de27f44d42f525f7e0a8074b45dcc4037d27c2c798cdde687e3638ea1b55e65b9ef05a48df610a3622e8c32ce8c37dd08730e8efac49ace16c234860090f308719e9597f85a33ef4ecff8d5f635891d1181ed59f7bc5085fa93fd72456077312225cb9db53da0ca2bd6b38362545a7bdfed98f2f7f7cf1e30fb87265056faeed9b29e56eb6c670d31059b9878237dfd18dcaa510bc61edb6a20011b1c2b25203ceecb9d8d877f4b1becb62f8f87d2063f4a1a0f44bbd0f317d54d888549d112418aedbedbc535fe3df298a4e06909c0c30dcb4db374d0978071f9e63ab87f269c736a83509d943983b4bb8d5dcef61d6f62ae77e0f33c8f77f8afbfdf6a7b9dfcfffa5dc6fc94b57f853fe0799e1c5eb9e9a4d91eb09672a7c53847770af359f31fb76cbdf0bcee4becdaa5a86e45ab14f1ac0bc1b8bf0f0dad7796d3e443188d76a0fb2d793e30824791c8931a83fe471c4cc977e8a13549048fda32218fe0eae7d3dea0fc664704c4fa26e1fd6a3fee998f4bb83637692c0afa899112944cd8b4e0704f9ec98800a55b1daa1f5f38b706df1518b3a058647fd06265c15fbb668e4038a0a66ba826f072a30fc002bf9811b5b5dee106d65aabb77ab3b7414c9c7a24306c7eb516fac46e464ad6f7aaa41e9eae8f3b11a9813f56146678f6b2f9a3e3866fe4a0faa3003eaaf4f92c2f2b44b746520f4c7a9ae44d52d8f51bf4bb1a9b3434411ec8d8f0905dd024255ddf0c172a72aed100f6cabbb44e6edf63b8455d69ca32da94e7057636f0be7269b9d31e36bdc87b49f81c614a392271c5495975a975e63960591faf4c099a42b895a74b5a42256542b4cbafa8a490b620c4722f7ccd07acbb32432da1c16cb384ce2dfa9a7afa4f8de574a17a997c4dfa827e7d4b3169dda8b0cfb4be94426967e6b68fc9be4061d0915d23c45a6fb59dd81b505f8bd0abccfd80409ffeb97b77797d79fff7a09c2ff747375f7f1c3cdcf5fef8a580cc2968084ffe6faeae69d562a94bb73ee2bdb8d338e66841383325f40e6cf20f3ef21f3ad5b5ed73aa1e221d4e444c27ffbe9fad397bb373fbf7f7ff5e5eecd875bbcdb5dfb090f35477c60fb29d21b77218d690d047ade6ecffff099264ebfe68e63ea1e28e9f76e64c0882ebb449d6aa811914ae9e0e1238c26ea68d125fdfc2ab0a552437b18b041b8f6cbf7b111b3cf3d13e6c7fa0d7cf96aa137b51e2164b1dd2e0821d26e66f64ed2e368311e5a4268a8d9eef059456f2d68e6b4eabeda2a1b841bbf7ca8bba955b3a255b3ed76b6dfaad568361eaedc56e922f5766a0f14314d1103519e490e1f871ca99ed19ecedcfb35ab111b0fa9bf22d23d08517fed46ac61d96e2f915407f19b225a870f1f8ae2293ad24b852f62e33ae64b2ef7c5cd8d2bbfcdcb458bf2e5223555720c9ce8cd469f8c86cc5f691910f3d7a4cbb5e4c5a44a0ed4a6d13ceda1dd7e50c76ad585ebb20b26e6bfe0a834b747a5dc6c42f09908177bcf598a769be21b424bff86564f7e53578c5b3be8f4315c7ae93c8ca8f038d304759aac7ddff77ea1d26fe90ab565ca53155eff575658c865de6a13eb5baec7ed2de7228a592869b377747fa5181bbb0bab5951fb3055fbb09e2bedbd5aefbbd86cf40a44bbafd6bb2f36dbbc82a4feea5891447dd98e507f7d8cba9a3a52a769ba49b7dcb4f03b9aa61a5629f4242fd4d6a8dad4316c425ead6a51c7300c790f3a7d7caca8b56e7cbf4bfd353e4e54b8e0e42fa569d3679ed6ef8936fa3f2efcbaeaabb2c6fff573e3af38b4f2ed42b590667a21c553c490222baabdaa8dc5aba62ad218ba38b5ed9cf7f86f31dc1ebcab6acee3e54dd48aca2ddebfd0eaa06bf54eb603e3aca1aaf6cf81f9fa5b160a5a55fe55aba18edaaf2e6e98ec5ff4aac8171afb139c19cd5b4335c18b414392dbd1e0c5691da2d6cde0c5591da2ec64f0e2a94733dd27e5cebff36648bf77d63f3b3d3d6ff6d4aa08473c4567daaea7f0b64009cdb722748246fff96f637c3283d6ffe8ff8f7e0b6378e9406346b4b3bb0feaf0947bc9ec63e8bf30c6430ae57f3872e03561fa8be6ba4a27de31f3e674e529840fa5f718cbb9b7147442154be8b5feade57b57feccf7feadd79b4e7b3ddffb894bcf386af3fed2a1c3c36d78f5eac7ede0fc5cfb0fd977026f0e790eb3b27f37e1d9fb2de60538cd2c7d374b65f248fb16b989aeb0548328878ad377b1906b72d40717d8884edc182b28a10d7d78e686cbbebfbcdc2ba3d559e87d02496c0e2666db306e748d9512cd1de35a4881e148b38826fc3914e1824a9500d47ffbe9e3e70fd757775f6f2f6f7ffe8a739d8b03ff814df9359f21819b4e0e1c03cfcd6e857bd342960a9cbce576d519dd96e264fcbf5d7db9bdfac7ddd7bf5ebebbfaa2352aba51efbf5cfef4f1eae6364f303d0da50c2773db29ae0e477b71a18a4b4a12a09a67fa6e23cace2b7ee5fac3cdff51ed79d6d473ded8f30c4396f79cbbe6e1764ee329d20ee38fe56b5a718d23f455fcf7090fe5e9e05288705dbc857a2c8f07ce513fa54604b22b2e6516d584f655ddc2f1f866079cf486fc952c6f7417a75839e2630849b76f2c14b5bfa3516fdc6eb7eecc777fac1b1c9aee1bbfa8d77c623ca03135d62121a4dbdf775e6a07b6386acec3075abc0eee156e5b03afd589f1508c623fd52f510ff09884bb9c26b5b2d69169d376dbba33dffd71c33bddea0cacaa99c6b34c508f67d25bf34c78b1f683ed7b9749e2652c56a42bf5d2b93e326b832543c6fe92ddfd45d1b269bc022f644e03530b10defda5a511ce8ec5cfa6b0ea60a8bd9a1012fed1e1b02d3b3018e53ab236619565134830976f35ca0402267cb9d6df9f4321030e8a8b2cc3b156e3db56a741081343cd025abfdc61ee8ee59864904868eca123d6d12f2bc80e1fefb9d43d94cbe29cc93cac9401e687c40d37ffce9ff15fd970fd9a6a9eebcaa5cac606ffb15c03143f8ee8d80169bc0eb61ed1f1d09891da3bfa7aa9d843a64a057534868536073432ef1cb237cc0d4f8b141064821678b8440264eed9653dba1f2dc6a567170b5c9407f7a3fc734c14a8b92051bbf766733fd67cacda68d5d2ca836796cd5d37e8c61852d0962fb0e7655a10b90f8b70464190c5503fa5a5764f9ea69f443c8b1969858cb3f58267690ba4cf59c2c3c815c9a8864f91be68897720fd544c888b7769f906387df462343f9ee1e1a3f112ec5aed4fab6e09268a1af2dcae32a0bba1d0cee533418d838cd7e4b1609b52946bfb1f4735b0f13056fbbd1f89f051f7539debfd094f8e67207cc11f8f6730831986fb111d13a69a0feb91fe1deb67b70b6cea81da02dd770b4a33f613faea550f0461ff4ed531f964ae823111ff5e3c345d69542041f0c780c38427951b5811c29b2bb7ca15e9c103a9beed99a8116db7919dbdca75c3070c2b3587260f86d5eb7eef22423878c85924e776630467bd5ee5fa8e23d47d1cd1da485a7e0704791cb1bd34b902aead6ad5c8c68499b11d0a67e4a5e657543a2d471e38c466061a6a7446a2a1ce32559bb23dc0dc7938926eb7fddee00cab999891392c481fd66aeb54436a557b234308b85a22e6d87e1b2734f5965478b6ae7c63b9a7de923faa43fbd4938fdc6f6984bb221bdb88423369420c8c8cca38f5b83565a58100cd6b9607e610d47a0ab2e2307855bb4eeab81246b44dbb7dec3ab3b78ddcbb4f676ed339a9c1f90b45779fbd5c5cdc5dbeb399831edcd935d88334fe9d068d2f3a9d0e201593803510fb17cfbe14e5107b6b0dc842193f50e3b5a7dd5ef88638db6144d5f45c00b8b0ac670e85870bdf186ee7318b51ebf6ea1fb73f7fb96a75d818c342df8529527d9b7837780752a54abad2883b78574decc1c2fff2d39bcbf2e7e79baf1f7ebab97a77f7e697db2ba076a5d8320a4634ae1653063e5efe74f7fec3f5edd51758284ef5eaf2cbf7e7fd7053cf7bf7f1c3e78f979fefd4f7d5d75b55d48c322a42493fc6cb45b8ac94a5922db3d28fd1e3a895868b6542851a2373c670479bc8ea35ee788ae6f942b4841e2499fb0ed623232f31dbb574b7eb23e9ecd7edb60eb9956db70ca948a07838f7cbe585dc6b4d42d1e10561b022196218e6d6fd15c53023abda79e457f8acfb9b16318af09095ef72506806a35678f740859a019eb6a015de9927b18a6704546476974e04a5ecabbe00d1caee1c9b2a9568c6b1e706fa6e60e0064e4d098afe7ca6c28e5d6beccece143dfa3500a00ac0e861fea6db6b5a68ce1a8f7ed187a7c1ea9dc3b02ed693d172b9f779d2aaf7f3383afe36bc1b49b57daebad4575402ee46b2d31f932ed34f1d17518331393ba6be25293aea54e7eb384067fbf9ce2bf93a7d1df962afc61f4c4eb7b01fab39073af2e57e5b7bfb59fbfda6bcfdc15e83fba7fb2dee9f3535b97fbe9ff94543cd3f54339fd65e58ba232bdf3921a03bb8846f182ef367a899598115a9a56269f0905d14a516dc6880cab81ecc8d9a4cc34341b83559ae67dce10a3f44f1e6522b712ebba4af08471cbdba6cb74d9c2eafdd9e5be58d6d0facfccad906dd814128b83cfe06df70f579268575ac6845d19edaa34a378a5db826748fb1b92714ae080305e05e45c69b3a45303b83c5fc857ff9e5cbe52f56d9086b9dac93de8532ac27dfc1c27ff7cbcde5c70f6fefde7db9fcbb367b4137eac052ac6463887a367d500b3aa71970d4876b67b90fd4722f090cdcc31556c90fcefad546b254b80b1d06b0f0df5f7fbabc55059e1ebbc2075f6d4f5fef3e5f7db9bbbabefa7875730bbdc345d68902f4ff50c93f62904895ae18400d94aa7de7cb87cb9b9faeafbe420f5e1c5f1a6e660e335868e3ba47d54db8861bf846fa3fc267c211865fb5e595f6c8ad5d245e921edced4b565e9c1537ac34532520d743052994d612c1144afd6130813dcd5f1041cdfa2a485c0382a555c9050f357f2ed65f4f6b29e8244ef5ed6f1ac5d962e94d553b872d683d84621db399f7402767de84275cd4624fbd074bdaf5e255a9161fbc7cd778e7957bcb33e9fd67d207cfa49fead6f138f21661ccf47b78d8dbb4a0e5795e3cf550a5adfeef1e215ecf2f203c6f96dcbd17e1ccc89c49ce530fdea1b20750edb0bf5ae3a1c9bef3ac52adb19efe1faba7ff67eb19fcb17a067fb69ed33f56cfe9b3f56ceaa5289c438549781f0fbd5d0b5abbd6d8ff95c70cb5fec95a15ff1e254217923355c6c0735823556599aad1dcdbe7955c2cd325b89c939bb808e599e7f0516e9a297c8f457a7efd1cc0df597297dfbef7885ba9776c86cae9e689dbe07cf85ad0326d9a70c1a81ae1058fd07eefc13bf31d68d5fe0f2ca22b9bc1bcf3ba9fcd3b51f960bfc7b5b254ca17fee8114f9f7b9f03573df0d4f23971325741def2245b30dbbca2b9e0d6562bd4d46f5faccd339cd4e1b56b4433548a4ef4f2a9a823b2c1d5012a86b958394efefef3f9fb4fe51f7c57fd3d37ffb3b5596885732e90774c8aa11fd613fd95d721eeb01f3f01bbce61d5803f05f87b311d4fa3d74933bad48882e3c4476b4d2f651256ae8d9ae8036288222d38d74fa8578b08ce7fdc8de1c533ee946b12e1554d24a6c5bb2b97e513cf59967cce459070597b31f7a95cdf9a7285cfe5ba69ca953d97ebba2957fa5caeaba65cd3e772dd37e59a3c97ebb12957e468c5b4fd9a3ad5949acd9c27034e4c52a9035b75f92bd66eb357c25f7578bb2dfc7597bf92edb67c25fc7527573ebacc7b52be22e6156e3f1c2b10c420aa4a38fffc4b40ce89c131c7b68ffa148973e7700c424b3e8c9548e1554376481fc75324081dc9b11f2e97c9da3e350c0ce3fd4ece9cf7971d1b2ef34805e9434cca07d5c38a21fd1cddc048021d6360dad4a67ce0635d3ee5b383cc95e8ef3f4310ee3f43a0eff155ef23e8f17fc3336d4e6a66c0783ada0d0fb9142bbc47a41852d4fc2e84d38ebaf5d50a6f44a7f3ef3f1042d41153952072f3410e3139ea0f2bddeeaef553f7d5de77d7bee44be024d12fe0b4dbf288107e8164bb3d47f73092630c92a8e2e2ed768e1e750c0eac5e30876fb7910528b218097cdc6e2fb52fe4277a67de89a85bce0bd38314d526efa95e0832d2dda06310a3def802c5648eae4034bcc114eebdc19461583cf3fcd2d38f1b3d802442bf2862b133effc137d5715eff79c9728fddd533834db94ee7f4642fd90a920a370bb95f978945a93033d5800efc6afce7abd763bbb98a3cf20703047dfd400c684c31c5d83c0a65378878d1d75fd9180c263f35e8a6ea13ee89ae129d41070a5fe5cab3f37eacf37f5e7b3faf3ab5956aef124c2c319fad560f925d9e851bc5267f660023a704dc30775cc2ddeab0852b04f47041914cf3b04214c9278f22d8821ba4fdeea4f01ee5315dab7e6dee3120173dcb6d7bb482ee172f75d4f8934bcb7fbc49b1f8a4778d66977ae4bd757c5b85e75ce9b7eda52491f860e302a5580e0fc5c55fa9ca30623f2aeb8aab5cffcbd80840c8ed1e0194149e7e7981d4ec5b0247f46a270f0cce39e080bf02abf070fe4fbcf7cbadef0ae28ea4f9ff3fe6847fef4e1cd57e70abf971f972776306c1ffcf07ed6342673d28399163ae999b2b2c1fe8be34451cd3d61d40cc35ac73ab3ab225735cf0f68dee9e3e3e4f5ccbf5f4b7aedd80ed1bdca06c71528600dd6457ae3a9554bf1506a03a3b56e2aac898419a18505aa119715ed0af186911084790c941251d3a13cc052ed488ec4543f1927aa3a14daa4435103fcb4e244732a871415b1abcf780a4c57a487a2aec4286582f5559d33a871049c88e368b818712dac87c58877faea730deb11ef0cc6849a1a74cae998480b74a63e0dd07901b483f26258c5407a8530cc3ba40fa1ae7507e5658b0adc5ccbcfe7a54c7ddefeffa83b831d3761200cdffb14cd1e10a65304c9de56ee6d0f95508ad4dea21c28260b6263455936218df2ee950788c70636d9b4aad4cb6ac1662e197d1eff33633bf86e6b69e787463b17907b4285bd3d19935a4df9248015cf8cde28b366ba3be622c57b30fb0740d93e20a96a2e4d59bcc261ad9a5bc34f202dd53c751c37e59350799aad9a17a66abe627ad274e51654357f8517a6868724eec250cde5fb54f331938d63dc83b492c293e02ac95c52b95c6242f73b0430f5720609cf3f876dcbe550bb65d2f64f6e7da33ecc5d777e91a05f40820e952887c2ca79d29739d051979c8c55f4da9dbe5a3b2fdd1a707ec85a18c60a86fb2f3cba8a86d19fd1b06430e7124a5e61b6e844cb10d851f00c7678e707a47c6721f0117e3210d4fd53061f367c673230bd998162146e1bcac0b7a6b50c7ce66234915bd989dc87f9a2f2ea867af86f97c36d9f107d98a52cf179a62967466258b2b3a6824c7b5e74ce33b58cc2c1d851a38212a35bc69a73b1e3e0bb9dc5b9b2f1e71a62af869a5149851d339741fc898766051a9542d8d1fee504059730c9f48cc31a5cd67004c202d7c1715cac4f147d706d4c70ad999e345db91b0aae1c9e981a1ea20cf1019881d0e0aaaf00d798c90e5ca20fae8b66c3a9b24bc825fcf8dbd7f90f85aeb8d10f537a144393ede3f7b0e797a0f87678ac764fff3a3a7eb4a3e3d9ff1c1dfbf5612cbbd1592a64d5660de877bf3e7ad4f422582e82e5fb62ea68289ede23966d94470cca1eca2306f1f99af4268a953ac0ab7af1cf96c63a054d03273441fc3a90137e39c73f37af8617da8648f1dd789d5d1840b7bb957f63773bd064a33fbc0bfc30f0c33bace3537f60112e991bb2137bf81d0000ffffce0c5d9bfc000100", - "f256e6f5a46e10e60db6a2444386dc4e": "1f8b08000000000000ffdc7d6b73db38b2e877ff8a8eb237a21c85923d4976d61e65af9f19573976ca76923b3737d7059190843545f000a06dedacfffb293c48822028c94eb2a7ced187a9986c34fadd0da0c18968ca05ec9ded9dfe717972797d7974f1f9e8e2fad3c5298ca0b3b5f536dc1e6e87afff166efdf5d70ebc84ce20460271c1309a777637f4e8b3f3c3a3eb93c3ebd3a3b3f757bfc308debededdd8180c604219703ac7c00543e91403c388d314229a5026dfce91e00a0ac753cc01a531a434c61c528c631014c6186232996086531186214488e1499e3c33331f1dbe3fba3e383f3dbfb83e3c3adefb747a25c97efe5afd4afa2ca8f34f57efcf4fcede2bb05f7e791b8fdff8c04ece0ece3f14605bd1aff15f2725d8e7a38baba3ffd39c7578ff56fdfc807b0757279f8f349c336f0deee0fcecece8e0eae85083fae7be3cf9bf12d59614739420cee198d154e034863f3700001434cb23415980b2ac671ecb9f98111ea22c8311a02cdb759e4782dce2331a631841b7ebbce518b1687685d9dc791bd3289f4b0da1383ebac5a938255ce014b3a01b2524bae9f621c03d18bdb3e8903f32816086f8816421c0a1406c8a451fba69b7d77340e52fc10266629e18fa8a01bb5e40694727318cca11214953cc7ebffa70babbd11841261521c5803e74b53cfcd4d8c20c19e658ec95d20b7a4da2e48f6191b3b4f9eea149d1600057e787e73b80e218341da0752dbd84e139bdc59051cec938c140c50c330e418a23cc39620bed7b4a6130c148e40cf79a9394f4d7a9d7b2eb83603976387928ff7ae8c304255c02d4cd84a4445caa990b3118f6ec1796404beb9962719460f9cffdc5491c7434f99d9ec7ac6ef022cfdacc4aaaff1625b96d24a17a100a46e6412f14f494de617680b85295639481193c1a41a7e353bd6253a9bccee72a553b6a6e3a959ab83ea6c119c33c4f048711a4f80e2eb170679f5016280f003aa9341cf35085d6f3342129f6714526411a728198e05f88986929b49abe2143ea26483dfc3fb4984d832732090a5c9cfc538a1db67c930e06901021120c3314ddc8e4802269ec80b5cdf8a3008c4a4a153f3ce88529be17412ff4081b96f8448b3b34351a139e2568715649bb60d01afc609b5dab07440946cce7001d15573b2d0eb0cc3e1fea3e59837a9453161ed6e9ac9b2656454b43129fd13b4dd131c149bc16595d3de91786b20cb36e2fe46291e030e2fc0adf0b49a5d1cace38a1d1cd6ea73621169702899c7f90b1738a83399fae270b35aad3ab520b8c60cea7bb0decb25e7aea1c72ec7a33cde89d94e729496fb80ae27d483199cec694f1b526d381df99463e94a51f907447d68025ca90a4da65e54b9a0be72dcd857a6d197a91c1a542481ad13949a7baf6db01cb8c060328de96cf6a51cd26a1077fd6038a9ae0e5085245d70b8618db0555bcca42f5b7317b674d55052619fe1a9c8d4630941314383b29853ae1cf3a168e56c192d411aa446809a6100acdc594b60aa578bb4a283417ad525142e8b8a251b25a4f34855abdb2a9d3bf9e6c682ebcc2a9fb90a73cc9b31809fc3be2b391ae441a65ae5dceea51bb3653150237e1cc0817942d4286b3044558ba2e0ed23c49faa0ffdb7dde7da931dab1b56ee9a5cc6054cfc3c5f3af1ac337378036fc58725b79723380dbb1d4e2643080286772ed942c8a1a5279f31d491248282f4b4a49ecbdac2d260cf3d99a8b82d542826e6f5752a18884844648109ac20cb97328808a670f8bd6cb2747323b55adefaa6b8d6a1a7131cc30e1a90a5aeab1c140c904e4739893e94cc86530820c33b5644e230c372449307b568eb150c108f618438b70c2e8bc3647c82913b57ad78ac75f2d2bac8795f6aa51c60519061c33f1556f729630cbf92ce8fec633946ac31b755263979d77dd320c0d24c0bb8e5b6a014e387e0cea35707a82dd52933282f0c4abf01f94a441a7539aee43b1363fd43b2679241761dfb940d7bb23ded2bf7a5fdac172a8c9641db043c2239aa63812385e026b60084d979267454409f301658eaf4f8b5aec4a15e975b740b7d322945af3a96cb4b90d03085c19bcdaeac10ebcda92468a53c1163afc0528b9430b2e7db2e4ad574ea4576ea0f50d5421da5159d2455f563f41fdad2db312a6a793ee2b3839e42ebaaa8c7a5566fe02c0e5d480a1dba9060a1e210ff5ead5564fae808fc93d8e83edbaf8511cab2c42e23d5bf664123cb3a89d21ae205c47b740e4b25082ec7a16486671e5ab8a3b288e717c45251119a589665123f2e2d1295c2309fca9b8dc4911789e51a63647c8bdda2099a03c110b40294a169c70e098dd6216424c21a542961d663f926a6709dd958e4a4b269c575496796b4e4d567e9a3c6594a0090e316394059d0a1f8c73a12824a92130215cec74fa1e51b91b119664c82468315a8ba236bb8e718285e1ba5e2bd65ddd83ab7ce5e0f013664c77b5d119401ba9df68a60c653303f7193381ef9f64ab963e64ae35a1a2cd6c2b11b5b0694c6c0d3e0de46a46d7a65c636c27dd4ff23a81e0c711992e89091ee12e0d11d5bac271e0ef76d21aca1fe4a7b28e9fe1e806c8a486cd4cc2b16821fab1ae53456dafa6b4dfa0386e771a492ac34860936f25a965d29fa3cc337fb91a22f1deb732bf2b2467c5bbf3f13f70d4d8e96c894c4fcd3d35d555565669c457813e0e2bf01b926538f661f7ebbbd4b529d71c65ffb0f8f114df8c8f199d9ffb62878fab751cb245ed162ba63a731622e94e5573f66baf682ebcef1e7c7140b3e206829f524014eefe83c28db18efff975c1b3efb1f8efac4ad736f57ac08e31106eedc4e83ae1bf65b1a33dde53e73cd9e1b5dda86d9120a2a9b254f99ffdef4fc536eea59ed1972357bac75262f67f1431fbeb11d3b01e7b0128499248bcd6b34cc93522dd54a5169eefcc5ffb76f1e5cb8b72b91ec72af256a449d35f48a718533133ac23865d8f80155e012f5e343da1d0837c29a97d3672ada8c535501c1fc553ec585fcbc1a02d66194db4ae1ab08381d99d86b8b6fba37306aff68621a1f426cffc93d54b23b5f3ae23582b79f688fd6f2149db429e21d2f411a8fadade0d5106d918f033f2c2bab8f7d7c2bd5fcf170d8daf63f8ab0dbe81b66d170296ed5b160122a1d336cfc344cc30d32944c60bed279d563375f733abbde79f19671df4ffe5a1f611f4fcf4686b031a2b6d4ee8cdd5de98e486d8a70799b60063bbd2f2013abeb42f22dc22880317244960866e71b5287483bed6f70c71a9bb7221b02ab89451ce892ccb102e8d28659cf5b6782c0b258ef5ad174d56ef67faa2482d82b856ffa420520b1b5e25582478cf38eb26b5ebaedb02cf21bbaf69a007ef60d833d4944729efa57f7ce711ca8c4c670999ce048ecf569ca658a0eae8b10e5a8755ae0b23f84c6e51a8e8d48f1a48d55312f13aec6782efc23b3c9e26efcdfbe6110b4aa23c4182b2fad008a782a184884593aa042d682eeaf0a7ea5938a12cc28784297b0f2ad2fa8e91f18c91747a8ad3a998edc02fc3bee7ed01c593c90e0cc3e170b855078819b25e6fd75f4e19ba2562b103afb6c2edca08fdc225110f1392de0481fcafa7edc9989857aaa7725ddf6c176eebc8aacf6a16d91f199d32340fc63949e203c2a244ed4e5ece508c59d06b1f2f5d2f5047b1ed544bc3fa82c7ef4f35e2c06af5ed7b7b8e9792ce701a638699c7c88a574b54aead66c736a186de14673b7546fb6e741288a498edb4b76da99151d7d9b3d1242a97db515d774b38252911aa37ce5d59ea482a15f4891cd08432d311a59acffbc0d12d1ea98e3e37a2c9112745382b7538d536f0e944ebd1ee2381c08c7936823c8df184a43876ab010d12ead6f791a6a2adc490b479ab093776e9eecb3a3d0f4d21484916422882fe6a414434ad49418a40620a7cf50899c85a454a20cd93c4255ea2934eeb97ab22ef448e0f49ec2446295d33729974d5240aac94708618c79a67f56879e7668bd47d925776592cfe9a14b7d4e00d4dec2fe41f27b1626fb536568a4f05c5ba59ae21b8f585f67813ad04e5d056df7bad753b719ca884e4f6911485772325bf8321fceb5f2deea1ca8b77aa4dad519a2618a5906745638ebf1c5bd2d7ef6e74691f19e329493f295d373a6d56f783d9dc7fdbaded2796bc151b892aa2d44968863c1b61df7723a5d7364bd9e568ad604ac865cd984d417a2271bfe5d68baf2c6ec6b0b40f75c63c57775a7b012a16692e1ecfa3eeadfc373059e730edfbae31ad34479cc69531d6de176540c8b0fea7e7b2469157ddd21aabe7f5da42555927699617a3ea9581455423856b74e19ce61c1fa502b3d65ac95e7c390da132102f2913ec394e31bac541e0bd90f423a30cac1169e011b7881e6afc81d320f991e15b4273aeacc7a3b4e5f1a97969c465f389566faad5eab290c7608bc913dfe44a014b26f7a6d4bee76ae052127e88cff87792fd8a40715c2ba6ec8da862dbae6d1fc8531aacacd43c24e8cd5f056825e88a17ebb4a89587b2bbc943f9caf14e839463d35ac0eec84a07791a349b2df7b22c21a6cdb8b94f90b3a4813067098c20678923a34971a5522ffa8b1b962a40b8f28c8bad815aafa717b4d82790d02a7216505e36e5ecca6a551b35e120661890c5234a1846f1020af8bf3b4c2494c667f80e463074f993afce9358bfaa55644febb6d73af535afbb322844db72edd06acb5fbbd5bd66559e68d842c08a9b482b2e0615e9a210be374ad9cc36b1edba4be67243affbbfa21af80e74e125ccf9b40f5d559befc865f8a2db5a57af75efe8092cf871ae60a431e8b1ecd437465dcd37646bdc3274fa899b37cdf4e9a13e17b1d1722c4e642d728b92a25468dc5b748553dc7b0b13b55bd65613f8af86b64bdd7375a060afd69c5f09ae0fbf0c878ef3c870e9240e59e311941ccb487045e6981de7690423f09746a69db80c29ef9c38f212b6865e7e2b0d79b6cbc3300486234c6e715c353d9793bc848e3412b7711f3c51ac3670dd33b8042356eab9dc50aa09a56d6a7555f642f90d49a74b8a35cf8e556d0218d5accdab953ebc29355ac3f4058f398d6eaaddebc2b61deaeafd4c3724baa19389491bf6953237fb089663efc666582f81a0d17bf9e3346e557bcd93119b2de32960b7eeabfbf2c54d788293b82d17b9d74e3db7b26ac1a26de5ac0e5a32c4398e81a4b2b2a8ef02141f26b823694cefc2e2565438437c16f27ccc85d2d8566d33a7c8a4bef0eccba26d61d43199461c55cf4d79f2058f2f355c6dce207029cf181534a289be323f1322e33b9d1efc1d3a779cef0c061dd891ff94ffea15fab6c56288f59112d29466386d094afed8df2909073916c7219c5214cb85beb43d379678227d8bc36b8ab8ac023bd78dbb447d19ff6c1f7d58ca963aac967cb52e749731a647d3b16a388c43f89860c431309c5014872e6dce01791b9a4e1fea17dc977330d764b5f1208d5d2c32fd15861809f475f86db701215f9410c6fc6bb65f0092780f4660430dfbcea767bca3f6eb0fdd1cfecc2d7feae1e8e5cbc60930bf23229a412079f3a5bb482aa273ddd969bc01152a746fe84c9ae32b2082c33f722e0041668761fb376618dd389aa84fb6d73259ed80d8acd6406d85f87b422b226142128119d05c009e67620124e65e5832918bb7a2e4198d5c9db47c3f02aab593671de9fe9afd4296605a8482d6118a75c9600db914047b17ae2dd441bbda0e5a2824f1be63ea7599aeb07b2fa3b5de009bd5beba4ed669eb7ab3d9ae35119178efa5dab758d232b79e18a27fa318dc2e89274ac2eda8fa71c2385fc76aeb770a1e61b86d37d61e4f277d0c9da63bfd09845a1df92b292d7ecd13b8878d8d0d990d543788a95e682a53a55358e8a61159fc581b4981e7f368861ab56b2b57566a8a8d8d499e46c51577f359ab04cffbfa4af2199a9709c39cfacbb7a17a794ab808cd91390f2af85d89b944db389f33e86e11d3efe203739237bc1f0eff86f1af938909906a01b7c8309d98efafc962adab8bcd2ebc78013584c508f5b00aee23782d53e46000cfd974ecd418d6c976f14d8060107cfdffcfbff5067299ff97adbf6c990f02c4b9962e068ca299ccd432d9e0fb08670226847101cfc38da642bd24fdad24894da7e3314235baea62517f9da4c26029eb8d3e6cbd6db65b79a7fbab998eb262c670c984c1d219e1b7dfe0d71efc0b86f75251cef46e4dc8e81d7435627c9fe9465d92c20cdf9b8fe9c11d1133c8e4ea4a95bb9de79d108ec26908cf87c3c964380ce13d351fc7d21b308d3e0487fba6c5a4f97c8c59d736943ac716ca72e34e19bb05a6ac7a63b0b9b9019bbaed05b8c82713d880cd8165ef76470c27ff2cda378ac9753daa3e4602fa533350355ed6a879d8180ce00cdf0b88e81ceb7dd41962b1244ac83a6c9ee9be14bdad4a27b0f7f1447552463917740e5c75f9482c996e03ea432e5778e305a8a3af620796ed54d4b7340a19e2070338969a940e90313227eafb1c77587ffcf03520211819e702f31db8efc3c2f0aed7b3e49fe62e91f4fcbdabab8b93fd4f574797d71f8f2eae3f5e9c7c38319f1b7c5d75d6a845f1f1258ce06bcdaebad25e089704cf714cf27906938422b1dbad77e5746f115b48abbac5d16b23d706082531cc114903f9af1efce902181f0ea6c9f5474a527140298bc37b7805c3f04d0f36a1edcd4bf7cda2754cf9e6371886db6ffc54004c93eb63d59c661b8a07b270c6759048d104c39e178dfbeca1fb4d7f34a2fbff52bb034ae9e9b3474fa541c869b6015ddfaa03968f94bbf30d06f01145378ec100490595630565211cab282b13502ad4fd24d38082239ac6f0ca32310beb2549230c4474b9b611690e9994bcb4db08990b1e39c7b0fd1ac64480a0909594f0306c6014b39c034ab219826886d21427929898d12cc3715fd14e2480fa6003e23c9f975f06dd0a57c847bbee5ee9470db5e429918153c3e7d73c6218a7973290b441ce91780df9b56028e5f2c1cf721265d19ca83032b227844d6d6496f60736e57d18f661cb6b8185975cea80d994cfd7ad6fb0694ff675f84d2eda3db894f621f2a3f10fd1f96f0c2398d33888fab0fde66d38eced2a2c72bdcd8268609eb50e9f7edf70b6d670e33783116cbf79130edbd12118c19607a0eedabb5589665247093d4daa7f8ff3c904b3eaef627bcd6aabcc0549b813298af349a9905fb6d5a77f82b7afdd787240f354c8b2b07a1ea1f416f12f2416b3bef9e3774ca633d187d2002a68c20f14c8216162b16ba7756b6359e6f3e2b7090728497c1952baafaabd6512d6795587a669a29a46f1bdb03c7b73604904c53b50a6d7609a1c68707793619ac008cab7f5d581a2e59314a4a781c542591f653407236bbcb9a45eb4059bb8dd2f12ad83619a84392f810d3e77c7aa50797d9e2916a7c59ba02c3fbe76ad18d0ed43b7e989f2a91d1cf4dfa576bbdf9a34e2148d137374af1169932a490bcb399f32d8a5d0c1a17d4029cf48775f3da935def59f6270e6a68cde9c2f222b49950d9a5991a4d5c267a3fedf1992ea378dbeaff4b6e59cc6385145a2c4521e9ae86f0c59a5ab9e47e658c471cf8336a31c5ec19fb2ca7b804816312445425d1b57a8558393d7250a566cb7d044f6e53bd731641022f1bdf91cdea79390c4750528dbfd2a41365bcbca6f721d457978fff8a1f012b6e4f05772fce249e3b7bf55d43bab974760f9c5c252ad1c969bd705fe8f1c73a16f4b362d0c45224749b28098a13ba039334b1a15dac40cdba8ac480757d2324c6b474419964a57a35564f4ab5dcf6b2bbd190257879b69128e491a1b179b26e1dec5c5de1fd7fb9f8e8f8f2efac62d3c63d4f3432450738c127f5f421dfe71b6f7e1e4e0faf062ef8ba7a9bb964fbc9f23b601ca36980698e453d7661f9060e4fef5e4d60a375522d3e3add4e6d94faa706d4f2c247671d59a345b8f7f0de25b2b28aa2a0c335f4cedc3b692def1e9f9de554974ab216fd6f27eb8ff470172747af4e1e8ecaa0fc3a6fe9693e246e81f4ed1366cc2eb2655d26bd4182eadeae3f9c9d9d5a52a66abfae5fb92c0dd0ca77269c2804728c17c90a1d4789dd2a3de3cd1374dbd4ea753c8556140b5908befcae78d33dab27457955a09e7f88463eefadcfd87b0cbb08c704f60559abcc3e5816dffe5dfc605dceb8915ac66dd1abceb81d4586c50fde4270b4aa8f3383291eb5610332474cac577e65ba9889bcfd2c445bda0fa1fbc7233dfafa1317613b2ef3e9053e6e17b81d358574c268e56b6dfee723d4f02d4e5fecb116cfd0cd1146231df04d10971b960aa13b3558229ee53191e740f95cdd52bc955e39e2f145de0f09b0dfce205349035e2fe600077b8f8660fc33a89ab165640e9421fd5963ceaec17fa909ca45c60144b64fc0e6506475c7c7357cc14824e82b8e898efc2a4f5caa0c255d4a4690c319666c531cc11bbc1ac280a2d3c21bc27b798434a220ce7c156cf87d1fa7e6c5fdd899fa31b5971c418b8ea5c49166a4b54ea7d86522002229a27318c71f3a8c75e05d16ca18cf62362c2365ca98cf622cc36eea5606bdafdc31a86ae4aad391633aa7695a2a5b153f23f43e91473b549ac8a7122b88d4f2b8987f0459a4fda156aeb8b0898616684acf6ca528c633dd1dec7130838c6a6da9bd7ffcf059b4584b10e987b86e05e8b5fa973968f8c66980982b9ed5ee665718504df995b5585841e76371e36fe330000ffff85c9196802680000", - "f3aa7c7c063ea75f55c6f07e3b99f877": "1f8b08000000000000ffcc595b8fdbb8f57fd7a738ff0cf2327fcb97997a67a1c13eb4db6c11a08b14cd027d580430251d59ec50a44052633bd97cf7821749d4cd49da9da26320b128f2dc2fbf436f6eff0fb8901561f423ae33a5e0f9fbf576bd83dfe0e7b7bfc05f69865c21fc0647aacb265d67a2da70cc04236a333c77bb89a2cd2dfc59644d855c4700f0c3eff6e7a9df46700bbb35fc28a4c44c832e1118e50825d263a98172208c412ac549a1546bb3fd6e0d7f93f88c5c03c9ffd9286da453200a2804d7a0e84704526894202445ae89a6824356127e446528d277ef0da14d1495ba62f029027b322e4845d925814a70a16a92e1aafffa089b5bd8994360058c9d8009ecd6bb7df8323e61fa4475acf1ac63234bec844c60b7ddbeb63befcccecfd6b8ef3133d2a99733eedfb112cf680d5b117934ea4f6dba89a254e4176b0ab72b81ed6304209e51164c9c1228699e237f74727bca3c4769291f2a42f90190a1f10564822baa3472cd2e86dddb379e89d96699e454d58c5c124899c89e42aa612404fee4792bbee07028771d330527aa4bcae1a09c2d0f66b3a1742052d38ce1c1c863dc619dff632945852bf8894a2cc4796549bf270591b40d8a5d1f1286790277583d8696597ff78095319073e25fa4686aca8f8ecf0b67ca1ff3dcda26f3764ac5d998c8b0a7bcd5aacd93f7a538d9ddad1fcd9e37f9d119b4734b29adc6a938c78e54d2aa12a7e21c46771bf5db70b10f9267aa68ca7014e573494e7989926ac233278bca08333a0cb27821fb433a22cfe180d5a13be50d3113e1b5c46fcff5200a76588dd3f71793e40c9f9181c28a704db3ff4e2a1f25b9404ab2a7a3140dcf4d52904cd3675b3d9f944b3ad86dbdeac4f9b7db1f67820999809684ab9a48e4fa71e8ab80572ab41615a4429a74ef5208f60fb177c838264db2418e9990aef6066967826f056fdface05d8d92cca41f4953f9aba69ae1071f95866feca448800b3e7090adb33daf041a53954c89ee9d756d17e4426bcce74276ac960db153d798862a4df4485791d252f0631f74279f3da96039cac7ffa9ecc8448eabe829cd57912255fd3b67cab23d9754d94491aacce2a8167fbf7d1d1aae450207d5a4b6f29b6f75d01d0a292a2045619a033fce000c43658e79631cd8d463fe0ffbd78f630c605b652d1475b1259111938b66f5194d13222c268c1e790229516883d3e8a09ad487b88bed78bbbedb9b5e63df39d65ad4f645bbbeb98537558a798ef9cbf79b4115b0e96fb2b9220e48299a2fd41b5a1dc3dc55fac2d0a7aed7e12721ab172c95269f2ce00b708411422d65cd2c4cf2dd7426b71bad055f4594d78d5e45a2d6a6aed6ab4821c34caf22536f8844f29fa5510b18bf0677f6b06d26f36671806bffc6548b30614e5df874b5f50f006267d3b0a089c23508db7c0a21ab96db0894f5f27d0ba1000105923bbf0c44b72da13b3a88ce0910a59ca494517d012d5c2041c668f6445286a02f7537572c87caaf66db0fafdce3ab0fdd8244853a78564d5a51fdcaf5be769820758d441aa513701416edcc51b6b96a64a9499e4fb161275792c495f81817226b546c0f4f24bdb2c5cb7e6547abcd74cb627d8056e6a443d85e4ba5856c133a6b549bd10d57a821bdd837b5c4672a1a05b261c3f00d2490941fa77a2ebc6f955c78dd69387c6fd5138d36399bc0ae3e7b9c017fb2ec0c705c0ab645971514596e74fd3430d2fa7e6fa691f583fbefbbbbbe55cc610b9b322749eada3319cd03630c61a1e220ef6c4b3db4d204bdb62f2af783a46d355202720396458d520191085c68c848633ab168349c4ae4e6c4053ea21466c9100358e236d3b7191e91e79379a643918371c6c360af5c0818bb01559376a0e90aed393ed15c97d3021d04ae59bd77aba7926a8c6da14ffcd54c7f68191db5c8012c72b073f5d2f86aa17437e588a344a5ac05aea28f69f5c8b1200d0b58ab4c0ac65222bb06ffff9ecda0c1f55d80345a8c62effac0daa18651130e922004163ee9b212b3a7549cc33a4a722a5e7df84ac78f3c356a9783f06fa412d2177d5100e59974b71cc6f239b64fae8c04570c43897953a5286d21f435dd56c158d594c7a31e31dd2b1a3ddc6bd56ca1c08cd1c74340df4082016ed8ab26b3832b5e5e73ca876dadad7e4864565ee956264e6cee0e2e0c1ce9581485429d407c579fe7fc30696c41544c7430d0b4225977b73792b037a65b09a6c145e1c7906032a5fd7ba8c05adaa1538b4c6b690aa2a6a80ca183af468789cd7b150aca306e6a26481e06c415b83042983335cfe1f2b75ca37457092f82cee72a9dafb53d0c7495c6d5b6610bcc5113cad4f21de217e8cf0e7a5545e465489251a563aafb99eb67aab2971b57ae483caaba55cd88c6a1b0e330fd12b53641dc95ee87456271ff274e3c788acdf11b268ec29e0d665f922ac11a6d611c00c3a29d8ebb0165b7adcf6ea19b64b6dd52df57cdcae7285a074cc6feee89c68e91ab83c1b20ceb63407fefef106eec359327efb1c051e2c56db603826f9c199abc70ebe184f68756f2f07e27152c1fe8dc9ac097afee2e6befb5bca1bcf882296570d3d0b72f67cc9154bbbb56a840037bde31539ae8468dd98597169de0dbb1c6f30a43afb1b3e20d21c43d7f8c29cff16c7cda729748aa6f9001eeea336ccd27e4e0dc6409da72fe0f0368fd543189e62f333186842ddc9b7f9704b77cc60c28b79d2c08c9fe967574bf6a5f5a3432ce89b15bdb671fae77dbdecd57a33474b2953671839293b99b467aa3786ace5de658c6904c8cf8a23a3a7c95402da84bb1a99a9d60d7d4e93795068e0e93ba8fc7c945b0554d975234c7d252896eb8c851bdb34afbb01ac5290c63a82d64df7775ac05c4f125f1187a2ead3a53ec5dd8cd3b78128881785ff6d4e676e0ac9491ece9d1b7fb012555137ea5d00e64ddb77a8eeee6ed984b548939dc3c64e6b3e0e339e66bff03c6d071f7f7dfe5e97efe445250a9749c9594e5fe9817c85e9ace49d392799b87bf756ec35b877d5b03662bdc959f1ba241f5835e644df45796ba87c55207be4face0c60cca9fae8593af62e6c05192baccc6cc61d85bc26976dc995fcf056e1f928fd1e77f050000ffff222970aa71200000", + "1251d44231d5c73843ec32f152a99720": "1f8b08000000000000ff9c57793494fbff7f701b528454f6a6414d0bb330c34c46b319141a63494a356661304b331343ca9232527675254b961a85b2e5226d52e426a25c1165c992352d971a7ec7fdd5fdfeceefdc73fff87ece79ce799ecf79bd5eefcffbf5bc9ef7394f1cd5c55e4d554f150000354707320d0000e6f2a5020200403090ee0e0080aed8ce4becc6678b43e842164060f27d5960472edd8f4563d199a1479b593600a0c4e6b87b89bd9c9db00c3ed79cbe8c31977005c0f2b2d92511d019812c31d897e5c7e1e120d375f720600e1307d98772863b0b482c7f8e439890e516e6e2ce080b646098905db6601b0956c2157059623a58c20de289b0121ce42f5d2c4f845dde8641c07f41c48138c8ff1ecacb990a26f1852c30cadcc28c014720c068b439c2128546237680917004120647c2e0683384251685c622adc03f16c4166c2364b2b13432e5472d21938d83f88bc5022c0c161212621e6261ce17fac110180c66590389341332d966a2509e982e31e3898c7f2a9059228690231073f83cf0f233dd977f4c8c83407eb6c015383bff2dcc13fd308ac1e7c22474010c610e8771b9b09f689198c662ff3b5ae41e2a60c1682c11ff9890c1a2b1d8c6ffa7d4bf539781026767ec5e21c78fc3a30791f98c635c164fec48c641245c813993c3c492e0d61696240286802212ed3008040665412158a348186b22dc9a6205ffa9f14f5c0ba2350a498193ec50966404c20e43b023910948b21d91444121d094bfb98e3c9198ce63b07e7239ffe112ff958b25095974315fe8cee707fd4c00d59f2fe68bfcf90230c90d0d86eee3f098fc10d1d6e5d7f3e3a42c212798c5a408f95cf05ffe6239ff509f648724a0911824c5924859eedbdadace92842120890822c20e4db484fce032ff1bcf60b6601bd8ff0bcbcf2d1a99b27cfb77f46dc1fff978583c260e2284ecb2456c7c1a0100aad71cc90477c9eb091f1f2783ae757d1972852f1b2fbcf94c73d3d5dbd2d4b6704d637f00637f952fd3f4d9814ec87ed4f5dac71f1999328f02879262cfaa8517b15f1acf2b30b679941ffeded95975c3ab64d89aaad963b6127de445658bf98e6f4b4b56f256f6556f2a42837d41579828c6357c6eed3d3e15f2bc6624fbf894615642f275697e0408045aece8eb9b82673ebb1a6e7b737bfaee4bb23b6095dadd857983d6a5bd9d9deec80ca733be653298b6eacbf09219aaf9c563eab1f96fe7e6074043f506f18dde5cf401739dd52e8f078faa3b71cee88ab3779348a7ba0667c56834baf5667171cc8b31cb9bebf0b2ecb7044047f9b28b9f85822f79f39a4b7afafac7dd185ae6e08cbadada430a16bb769b684d1fbc77527e1b84f268895bbbe5a4aa6d8206d820ec02909efe48fec8b3dfd2dafa37c6c1a400c38d1bf9163aab2903efde3e3815353535158707e7769c4d4b4c4878519818135d701a682760ad470f2fceddd1783ed90b3479c4e28df6b9dcecfa905b2b79f144676fc152c70baf56d20a9187c6fd18a3b0ae5c5643cce3b566fafb6411eb941463623d3e5a1ba83f47e48b4680a8b36a1448f25645135b14eab33c08fd6d73e045c3fc4f0db16b22d4a82e49976a37a89ede761176d8bc22b81b71c96573ea4646244c0b6cf7ca68a70b0b31761b97d4404c7d23cc53f0d62b48372a2eb229dc818cdb1097f86ca69c8b87375c4c5750fc7562f6a0f935e30d525a2455d7fd42bbbf89687f7282697d6aaf6b5a9349bf34c74c41f8fe775d25d53181b5812de09a96baf23a74b344f1bd8665c9af898dbe7b1c149d67864076e27d495e1278e2383943f1e9fba16db17d24eea9e6eb9ad33e4e85b4bd7442ba8a06c6342633236336d4263be7ca7d05787a5ef3af079da8ac76b71515dd0715ffe0e73fe853300e3565f7fed2f4e8510cb7ffee897e5243fde98f9fa039c64569f11b03f493d6599efd66456d7dcaceee51053fdeb2373b5c572dadf117b656d388abf4960fc804b7eab3fb2daf1d86b27065fcd1c1a75b0b7b62636343af758c9130874f55ee6c3f5ea4bcebf4183fa5a5e37cad9b6e74cfe4a24a0aad77e278b5a2038bc532958a1dcb5598b79113caea0692c691b9faf657af3c15496713defb838d1d37466ec8d583f9d4054f5ef8dd2e491a936c8b89580ce754f48d9400448de771631126b12257b1d6c995290f3b70f3e2f12301aa26a793b4de5c21c52ebe7cf912b5f59a1badbccfe19823c3dea77807e6727c4a40b46ae79ebb45619ac53bd41917930d5276634cabf35e856685490fafa2e21cb82e8e879e48151e4a151e02f44740f73a930fe525cce3a91bed2f4575c4f85764bb9450cd72aafa401849fa0a8d222dcb95014141c5afe75272b6673ef3ec601b047a839bf73819f90ea4ffa92df7bc2191dfc96d5254f1002c7a37bb4fd839691fbecfdcee57d12d39b894ec60b299f3a54e1fd8046f3aaf1e37ba028c7b5b455cf9953db378ff08dc29aaeb61b004d5b4c9b0a1a161a1afaf6fe4cb44f7dcfa6de1e55428d5cbef21af3a316db7a990eca9db8e75251dae0f7b193adeb97517b6e703bba21b7448ad92a75432b3b3b23171b6225aefb1c6e0c444d09ecda9f3403debc13bc104e9f45eb49555ddcad5351b2282b534a8fa05773b2683ad9415a30e5ca1fab7fa9669df39345d07402b7c9c6f71f1642bfbadebe39fe5e62d51606521c1c1775ff7f52da67846dfae1e6573f0f9736dc07e07f91fcf32adfaed959d6a0e96162e2e2e965bde9a96c5fc295fd4daa669d26ea8af2f72f32336fef686b9bfe4d2f6993bf83d5d381c4e4176ab3b2a4a212a32c9f8fe81f53e908cc8826c9971fbc0b9d2d6433d6199f59543abaa8aef09de45833f9ac587de8c11f657e16d48ac8a0cac280bee1b09c777b20e21f19d96d4dd9efaf37169de2f0a919d680e4ae68c241fb03daf1bd13e26f6243816d2ca63d25fb5ae15d618d48408037ab885b53e6efeb27064467833affa498967a081d6c711df329d8bc605eee268ac4b8eed09e4faf8132b724394d26c86e3dfd9af4e42dd0e5fa1969e919525bfdd321cb64e8b68d4cc07e392480b140ae59c7da2d1e4e7b0fafca473a0c8078d83b3d052c5d3c9d7e9dbab2e019a79eda34a0e8f8605d64179d6fd0909096bdef0be469fabafe68485d59a66b92c81c0969074c192f6f052fa78ee1953450f00a25e9cdcd8d8d8e3301dd75d5817326d9eb333a4146a3cda4d861cfdda9e6fffd5d4ec8cb6a19eded3cea9e1235ad18f67bec97565e79cb846a6b3a3abf7ebad6269cf66e327eb64169d81a2a4aba0635bd53d9b439b2b82f714b1a61ad8e341be4dcbe176bd78881d19aee050d47a55966eb7a5def14062f396aa8c26dbe6775b30f282b55d43e74ea6eda82db9e05a51262bcfb69379e3c9a0add2e2daf964452564c6395e7d56695e4f5ead0bb7ccebface0ac0b7900a756faa81da1fbcd8b9890a4a444aceda6a575f4e47303640c767748fe5f7bf40500db2d741035ce39a0b6891eed53af690645bf84cc3d5ab57b5819a158fd94bfda1d24f56c31be21b471e0c554f04d73d0b427f18c30c2d29ccb7f47cfe72f689c278db561bc97448f20ecf1b55e7cab5a0733087c4ae1bfa18f4ec84e8cf672d72b9fc5bfb832fa9e24d39fd2e7fc80622a510e777bb0ac910cdcb3939fd394e9b238605d690ca28a3f98a0f9f7bcbca102db3834f0ef7d4854cc3e25cc74b9af6becdd8e9d0221cfddedeeedaf1ae21f65e02f26402b2f81720ec7823bb62be7d70e3cd6ab470f8e9ba9632c6930425e9e1dc7ceb077ee67ae74f9e5dda56bcc52340b14011ce265e699b6694fd7a8c4ebf3231376f4b31762add5067821c528d6de09694940c1716161eff2de753587d84bd71382456e45a7c60b0b7f7f28af1e9eaa483abfa22548edc91524a836e69b03333329a2536d97ba8856a49a536f7bfabcc2fa56d37dae3884f696969f99a34fa9df23477a6b1a9ad8dca53cadaf380ad38293d4dae5f155773eece2dadd6c6b1b1b13582bdb16bbf038c275645bd6ad9f1574ed5c77eb27ae3a7ccdf6d333c6c64cf547e34fd75c4f5815d514aca92bf85ba0db6360af4bab5d5656aa0317e486e96b23ba9e5779311885e44f2ea187d2b9e25f1fc6bf4f81bc8de1aef6b439e92d7b3841375ea361c5cbde7e926ee544262e29c4e9b73e6093e2e2be57aa6ceaba3d5e9dbdea85c3f8fa597aea5acd6a0acd600a91883549462349562fe1eb1f4ca339db777916146330fbb9a9b9bda073664ed837ca54df080980b24681b5e4a8618707fdf273c1e29fe8db039f5cac76dc29bdf397a1a47cd0e78797b2fb40d0bb32abc4b4282d00708cd3ecec05d9dd5a0e9cacacaefcdbceafeab70d3dbbb982870cb6851c49d88a593aa69631f3edc80ca88bf44ca3950ed5acdf39441434343ccd572cf1b6b381996508582211de19789fd0b52fc25dae4751325a61ab46a95dbe7c5f204ef81a4aa85c9871efae1a3ab9407089c75b534f74dc97fbe5bff2c5ce6951ae9f04a036573a23b125bddccdc2655e6bf870614d6d4d42ce89ff58a7b3278f624766cd51a15b5bbfefe58c19ce262f84981809a78af4e5873d9d6407de997f9fea84f6d5dea46830bc1d8ac562db013513b2f3959f3446060e0f36463fb85f63f606d21e1636bfba2f060657ced79cae0beb14c1adc0f073cc9adeaa056e9f411b246a129f99ea92547951a93fbba4eaca7374935f37d48063dca3273dfa9907f723e7279862e8f511d043e5849be2f5201703603e3e232da84cbbf828e762ee452e291e8ff090000ffff241161e8770e0000", + "365b40bdd0eaf3ff91befa9cf678cff5": "1f8b08000000000000ff9c544f8f9b3e14bce753bc9f7fe7e06c0e55d5029736daaeaadd54bbabae7a74cc039cf89fec076dfae92b2024e44f2f3d016fc6e399b145fadfe7f5a7d71fdf565093d1f92c1d1f288a7c0600901a2401b216212265aca172fe9e013f80a448637eef5e6a650c0698c313d24f1776f05dc54668f51b43ca07d6b0422bbb83803a6391f61a638d480c68ef316384bf88cb1819d401cb8cf1488294ec46dcba607abda4231cc4a20ccad374f556b462983288419e34b691b7aa155510be9e2f92bb65b2488cb2c936b23ce5c3927f5235e24a25e5437fb374e38a3df44133b611725705d7d8e203fcbf5c2cef96ef3e8e410ad5822a32a65de50eb37eeefb69df1fcbefd72f5f1e1e1f57cfe926e44fabd7b7f5f3d794fb095d990aa416311e94cecd2a53f1cac5c4db8a81d094b1e3c18d3e78a1da7c76eea9af4c76f96e80ca96370c771b367d25fe0616509833c68932ca461441d66f41787f34774a697d4313daf4fa30f05a48ac9d2e308c04285d00eb0a4c92848168c84967bc46c28cb9b2bcad3f686e1a226759bf9bd428028356e806c7af1c4ee6877eaeb2741bc7b5d5cae231d02d706c78daf3b510098a9786fd117e282e4a9fe0cafe1d730d5d9ed629cde135e5dd6dee6e35efff127f020000ffffe59390183c040000", + "653d997454aa41f83d7201bb5a44c823": "1f8b08000000000000ffdc7d6d73db3892f077ff8a8e669f8872144af624b3bbf628fbf835e32ac776d94e7273b99c0b2221096b8ae001a06dedacfffb155e48822028c94eb25777fa3015938d46bf77036870229a72017b677ba7bf5f9d5cdd5c1d5d7e3ababcf978790a23b827694cefc3844648109a8633ca05bc82ce20460271c1309a7776373486b3f3c3a39b93c39bd3a3b3f7d7bfc1087e79b3bbb13118c08432e0748e810b86d229068611a7294434a14cbe9d23c115148ea798034a6348698c39a418c720288c31c46432c10ca7220c438810c3933c7961663e3a7c7f7473707e7a7e79737874bcf7f1f41a46d0f9e98dfa95f45950e71fafdf9f9f9cbd57603ffffc4b3c7eeb033b393b38ff50806d457f89ff3c29c13e1d5d5e1ffd5b73d6e1c32feae707dc3bb83ef974a4e19c796b7007e767674707d747871ad43ff7d5c9bf4b545b52cc5182388763465381d318fed8000050d02c8f046501cab29e792c7f62467888b20c4680b26cd7791e097287cf688c6104ddaef39663c4a2d9356673e76d4ca37c2e3584e2f8e80ea7e294708153cc826e9490e8b6db8700f760f4cea243fec8048219e2079285008702b129167de8a6dd5ecf0195bf040b98897962e82b06ec7a01a51d9dc4302a4784244d31fbedfac3e9ee4663049954841403fad0d5f2f053630b33649863b1574a2fe83589923f8645ced2e6bbc7264583015c9f1f9eef008a63d07480d6b5f41286e7f40e43463927e304031533cc3804298e30e7882db4ef2985c104239133dc6b4e52d25fa75ecbae0f82e5d8e1e4b1fcebb10f13947009503713921271a5662ec460d8b35f58022dad678ac55182e53ff7172771d0d1e4777a1eb3bac58b3c6b332ba9fe3b94e4b69184ea4128189907bd50d0537a8fd901e24a558e510666f068049d8e4ff58a4da5f23a9fab54eda8b9e9546ae2fa9806670cf33c111c4690e27bb8c2c29d7d4259a03c00e8a4d270cc43155acfd384a4d8c715990469c80562827f2662a6a5d06afa860ca99b20f5f0ffd862360d9ec824287071f20f2976d8f24d3a184042844830cc50742b93038aa4b103d636e38f02302a2955fcf0a017a6f84104bdd0236c58e2132deed0d4684c7896a0c55925ed82416bf0a36d76ad1e102518319f0374545cedb438c032fb7cacfb640dea494e597858a7b36e9a58152d0d497c46ef3545c70427f15a6475f5a49f19ca32ccbabd908b4582c388f36bfc202495462b3be38446b7bb9dda84585c092472fe41c6ce290ee67cba9e2cd4a84eaf4a2d3082399fee36b0cb7ae9b973c8b1ebcd34a3f7529ea724bde52a88f721c5643a1b53c6d79a4c077e671af950967e40d29d0ebcaa508624d52e2b5fd25c386f692ed46bcbd08b0c2e1542d288ce493ad5b5df0e5866341840f1b67c568b6a36093df8a31e50d404af46902aba5e32c4d82e48d23ab250fd75ccde595355814986bf0667a3110ce50405ce4e4aa14ef88b8e85a355b02475842a115a822984427331a5ad4229deae120acd45ab5494103aae6894acd6134da156af6ceaf4af271b9a0baf70ea3ee4294ff22c4602ff86f86ca42b9146996b97b37ad4aecd5485c04d3833c205658b90e12c411196ae8b83344f923ee8ff767feabed218edd85ab7f4526630aae7e1e2f9178de1ab1b401b7e2cb9ad3cb919c0ed586a713218409433b9764a16450da9bcf99e240924949725a524f641d6161386f96ccd45c16a2141b7b72ba9504442b198841972e7500015cf1e16ad97cf8e6476aa5adf55d71ad534e2629861c25315b4d46383819209c8e73027d39990cb600419666ac99c46186e499260f6a21c63a18211ec318616e184d1796d8e9053266af5ae158fbf5856580f2bed55a38c0b320c3866e2abdee42c6196f359d0fd956728d58637eaa4c62e3befba65181a4880771db7d4029c70fc14d46be0f404bba5266504e18957e1df2949834ea734ddc7626d7ea8774cf2482ec2be7181ae7747bca57ff5beb483e55093c93a60878447344d712470bc04d6c0109a2e25cf8a8812e603ca1c5f9f16b5d8b52ad2eb6e81eea64528b5e653d968731b0610b83278bdd5831d78bd258d14a7822d74f80b50728f165cfa64c95baf9c48afdc40eb1ba842b4a3b2a48bbeac7e82fa5b5b66254c4f27ddd77072c85d745519f5baccfc0580cba9014377530d143c411eead5ebad9e5c011f93071c07db75f1a338565984c47bb6ecc9247861513b435c41b88e6e81c865a104d9f52c90cce2ca571577501ce3f89a4a22324a13cda246e4c5a353b84612f85371b99322f03ca34c6d8e9007b54132417922168052942c38e1c031bbc32c8498424a852c3bcc7e24d5ce12ba2b1d95964c38afa82cf3d69c9aacfc3c79ca2841131c62c6280b3a153e18e742514852436042b8d8e9f43da27237222cc99049d062b416456d761de3040bc375bd56acbbba0757f9cac1e127cc98ee6aa333803652bfd14c19ca6606ee1366023f3ccb562d7dc85c6b42459bd956226a61d398d81a7c1ac8d58cae4db9c6d84eba9fe47502c1f723325d12133cc25d1a22aa7585e3c0dfeca43594dfc94f651d3fc3d12d90490d9b998463d142f4535da78ada5e4d69bf4171dcee3492548691c026df4a52cba43f479967fe723544e2bdaf657e5748ce8a77e7e3bfe3a8b1d3d912999e9b7b6aaaabacacd288af027d1a56e0b724cb70ecc3eed777a96b53ae39cafe6ef1e339be191f333a3ff7c50e1f57eb38648bda2d564c75e62c44d29daae6ecd75ed15c78df3dfae28066c50d043fa48028dcfd3b851b631dfff7eb8217df62f1df5895ae6deaf5801d6320dcda89d175c2ffca62477bbca7ce79b6c36bbb51db2241445365a9f23ffbdf9e8a6ddc4b3da32f47ae748fa5c4ec7f2f62f6d723a6613df6025092249178ad6799926b44baa94a2d3cdf99bff6ede2cb9717e5723d8e55e4ad4893a6bf904e31a6626658470cbb1e012bbc025ebe6c7a42a107f95252fb62e45a518b6ba0383e8aa7d8b1be9683415bcc329a685d35600703b33b0d716df747e70c5eed0d4342e96d9ef927ab97466ae75d47b056f2ec11fb5f4392b6853c43a4e92350f5b5bd1ba20cb231e047e4857571efaf857bbf9e2f1a1a5fc7f0571b7c036ddb2e042cdbb72c024442a76d9e87899861a653888c17da4f3aad66eaee67567bcf3f32ce3ae8ffc743ed13e8f9e1d1d6063456da9cd09babbd31c90db1cf0f326d01c676a5e503747c695f44b84510072e4892c00cdde16a51e8067dadef19e25277e54260557029a39c135996215c1a51ca38eb6df158164a1ceb5b2f9aacdecff445915a0471adfe5941a41636bc4ab048f09e71d64d6ad75db7059e43765fd3400fdec1b067a8298f52de4bfff8c623941999ce12329d091c9fad384db140d5d1631db40eab5c1746f089dca150d1a91f3590aaa724e275d84f04df87f7783c4dde9bf7cd2316944479820465f5a1114e054309118b2655095ad05cd4e14fd5b3704259840f0953f61e54a4f51d23e31923e9f414a75331db819f877dcfdb038a27931d1886c3e170ab0e103364bddeaebf9c327447c462075e6f85db9511fa854b221e2624bd0d02f95f4fdb933131af544fe5babed92edcd691559fd52cb22f189d32340fc63949e203c2a244ed4e5ecd508c59d06b1f2f5d2f5047b1ed544bc3fa8cc7ef4f35e2c06af5ed7b7b8e9792ce701a638699c7c88a574b54aead66c736a186de14673b7546fb6e741288a498edb4b76da99151d7d9b3d1242a97db515d774b38252911aa37ce5d59ea482a15f4911cd08432d311a59acffbc0d11d1ea98e3e37a2c9112745382b7538d536f0f144ebd1ee2381c08c7931823c8df184a43876ab010d12ead6f791a6a2adc490b479ab093776e9eecb3a3d8f4d21484916422882fe6a414434ad49418a40620a7cf50899c85a454a20cd93c4255ea2934eeb97ab22ef448e0f49ec2446295d33729974d5240aac94708618c79a67f56879e7668bd47d925776592cfe9a14b7d4e00d4dec2fe41f27b1626fb536568a4f05c5ba59ae21b8f585f67413ad04e5d056df7bad753b719ca884e4f6911485772325bf8321fcf39f2deea1ca8b77aa4dad519a2618a5906745638ebf1c5bd2d7ef6e74691f19e329493f2a5d373a6d56f783d9dc7fddaded2796bc151b892aa2d44968863c1b61df7723a5d7364bd9e568ad604ac865cd984d417a2271bfe5d68baf2c6ec6b0b40f75c63c57775a7b012a16692e9ecea3eeadfc173059e730edfbae31ad34479cc69531d6de176540c8b0fea7e7b2469157ddd21aabe7f5da42555927699617a3ea9581455423856b74e19ce61c1fa502b3d65ac95e7c390da132102f2913ec394e31bac341e0bd90f43da30cac1169e009b7881e6bfc81d32079c1f01da13957d6e351daf2f8d4bc34e2b2f94cab37d56a7559c863b0c5e4896f72a58025937b536adf7335702909dfc567fc3bc97e45a038ae1553f64654b16dd7b60fe4290d56566a1e12f4e6af02b41274c58b755ad4ca43d9dde4a17ce578a741cab1692d607764a5833c0d9acd967b599610d366dcdc27c859d24098b3044690b3c491d1a4b852a917fdc50d4b15205c79c6c5d640add7d30b5aec13486815390b282f9b727665b5aa8d9a7010330cc8e211250ca3780105fcdf1c26124ae3337c0f2318bafcc957e749ac5fd52ab2e775db6b9dfa9ad75d1914a26db97668b5e5afddea5eb32a4f346c2160c54da41517838a745108df1ba56c669bd876dd2573b9a1d7fd7f510d7c07baf00ae67cda87aeaacd77e4327cd16dadabd7ba77f40c16fc385730d218f45476ea1ba3aee61bb2356e193afdc4cd9b66faf4509f8bd868391627b216b94349512a34ee2dbac229eebd8589da2d6bab09fc5743dba5eeb93a50b0576bceaf04d7879f8743c77964b8741287acf1084a8e6524b82673cc8ef3348211f84b23d34e5c8694774e1c79055b432fbf95863cdbe5611802c311267738ae9a9ecb495e41471a89dbb80f9e28561bb8ee195c82112bf55c6e28d584d236b5ba2a7ba9fc86a4d325c59a67c7aa36018c6ad6e6d54a1fde961aad61fa8cc79c46b7d5ee7561db0e75f57ea65b12ddd2c9c4a40dfb4a999b7d04cbb1776333ac9740d0e8bdfc7e1ab7aabde6c988cd96f114b05bf7d57df9e2263cc149dc968bdc6ba79e5b59b560d1b67256072d19e21cc740525959d477018a0f13343eb181f82ce4f9980ba5b1adda664e91497de1d99745dbc2a863328d38aa9e9bf2e4331e5f69b8da9c41e0529e312a6844137d657e2644c6773a3df81b74ee39df190c3ab023ff29ffd52bf46d8bc510eb2325a429cd70da1294fcb1bf53120e722c8e4338a528960b7d697b6e2cf144fa1687d714715905766e1a7789fa32fed93efab8942d75582df96a5de82e634c8fa663d5701887709160c431309c5014872e6dce01791b9a4e1fea17dc977330d764b5f1208d5d2c32fd15861809f465f875b701215f9410c6fc6bb65f0092780f4660430dfbcea767bca3f6eb0fdd1cfec22d7feae1e8d5abc60930bf27229a412079f3a5bb482aa273d3d969bc01152a746fe84c9ae36b2082c3df732e0041668761fb376618dd3a9aa84fb6d73259ed80d8acd6406d85f87b422b226142128119d05c009e67620124e65e5832918bb7a2e4198d5c9db47c3f02aab593671de9fe9afd4296605a8482d6118a75c9600db914047b17ae2dd441bbda0e5a2824f1be63ea7599aeb07b2fa3b5de009bd5beba4ed669eb7ab3d9ae35119178ef95dab758d232b79e18a27fa118dc2e89674ac2eda8fa7ec2385fc76aeb770a9e60b86d37d69e4e277d0a9da63bfd19845a1df92b292d7ecd13b8c78d8d0d990d543788a95e682a53a55358e8a61159fc581b4981e71369861ab56b2b57566a8a8d8d499e46c51577f359ab04cffbfa4af2199a9709c39cfacbb7a17a794ab808cd91390f2af85d89b944db389f33e8ee10d3efe2037392377c180eff8af15f26131320d5026e91613a31df5f93c55a57179b5d78f9126a088b11ea6115dc47f046a6c8c1007e62d3b153635827dbc537018241f0e53f7ffada1bc865fe9fb6feb4653e0810e75aba18308a663253cb64831f229c099810c605fc146e3415ea25e9af25496c3a1d8f11aad155178bfaeb2415064b596ff461eb9766bb9577ba3f9be9282b660c974c182c9d117efd15fed2837fc2f0412aca99dead0919bd87ae468c1f32dda84b5298e107f3313db8276206995c5da972b7f3532784a3701ac24fc3e164321c86f09e9a8f63e90d98461f82c37dd362d27c3ec6ac6b1b4a9d630b65b971a78cdd025356bd31d8dcdc804dddf6025ce493096cc0e6c0b277bb2386937f14ed1bc5e4ba1e551f2301fda919a81a2f6bd43c6e0c0670861f0444748ef53eea0cb1581225641d36cf745f8ade56a513d8bb38519d9451ce059d03575d3e124ba6db80fa90cb15de7801eae8abd881653b15f52d8d4286f8c1008ea526a503648ccc89fa3ec73dd61f3f7c03480846c6b9c07c071efab030bcebf52cf987b94b243d7feffafaf264ffe3f5d1d5cdc5d1e5cdc5e5c98713f3b9c13755678d5a141f5fc108bed4ecaa2bed857049f01cc7249f6730492812bbdd7a574ef70eb185b4aa3b1cbd31726d805012c31c913490ffeac11f2e80f1e1609adc5c50928a034a591c3ec06b18866f7bb0096d6f5eb96f16ad63ca37bfc230dc7eeba702609adc1cabe634db503c908533ae83448a2618f6bc68dc678fddaffaa311ddff48ed0e28a5a74f1e3d950621a7d9067473a70e582e2877e71b0ce00245b78ec100490595630565211cab282b13502ad4fd24d38082239ac6f0da32310beb1549230c4474b9b611690e9994bcb4db08990b1e39c7b0fd06c64480a0909594f0306c6014b39c034ab219826886d21427929898d12cc3715fd14e2480fa6003e23c9f975f06dd0a57c847bbee5ee9470db5e429918153c3e7373c6218a7573290b441ce917803f98d6028e5f2c18f721265d19ca83032b227844d6d6496f60736e57d18f661cb6b8185975ce980d994cf97adafb0694ff665f8552eda3db894f621f2a3f10fd1f96f0c2398d33888fab0fdf69770d8db5558e47a9b05d1c03c6b1d3efdb6e16cade1c66f0623d87efb361cb6a34330822d0f40ddb577ab12cda48e127a9a54ff1ee7930966d5dfc5f69ad556990b9270275214e79352213f6fab4fff04bfbc71e3c901cd5321cbc2ea7984d23bc43f9358ccfae68fdf3099ce441f4a03a8a0093f5020878489c5ae9dd6ad8d6599cf8bdf261ca024f16548e9beaaf6964958e7551d9aa6896a1ac50fc2f2eccd81251114ef40995e836972a0c1dd4d8669022328dfd657078a968f52909e06160b657d94d11c8cacf1e6927ad1166ce276bf48b40e866912e6bc0436f8dc1dab42e5f579a6589c166f82b2fcf8d2b56240b70fdda627caa77670d07f97daed7e6dd28853344eccd1bd46a44daa242d2ce77cce6097420787f601a53c23dd7df5a4d678d77f8ec1999b327a73be88ac24553668664592560b9f8dfaff6748aadf34fabed6db96731ae3441589124b7968a2bf316495ae7a1e996311c73d0fda8c72780d7fc82aef112259c4901409756d5ca1560d4e5e972858b1dd4213d997ef5cc7904188c40fe673781f4f4212d715a06cf78b04d96c2d2bbfca7514e5e1c3d387c22bd892c35fcbf18b678ddffe5a51efac5e9e80e5670b4bb572586e5e97f8bf72cc85be2dd9b43014891c25c9026286ee81e6cc2c69546813336ca3b2221d5c4bcb30ad1d1165582a5d8d5691d1af763dafadf466085c1d6ea6493826696c5c6c9a847b97977bbfdfec7f3c3e3ebaec1bb7f08c51cf0f9140cd314afc7d0975f8fbd9de8793839bc3cbbdcf9ea6ee5a3ef17e8ed80628db601a60924f5d9b7d4082918737933b2bdc54894c8fb7529b673fa9c2b53db190d8c5556bd26c3dfe3588efaca0a8aa30cc7c31b50fdb4a7ac7a7e77bd725d1ad86bc59cbfbe1feef05c8d1e9d187a3b3eb3e0c9bfa5b4e8a1ba1bf3b45dbb0096f9a5449af5163b8b4aa8bf393b3eb2b55cc56f5cbb72581fb194ee5d284018f5082f92043a9f13aa547bd79a26f9a7a9d4ea790ebc2806a2117df97cf1b67b465e9ae2ab512cef109c7dcf5b9fb7761976119e19ec1aa347987cb03dbfecbbf8d0bb8d7132b58cdba3578d703a9b1d8a0fac90f169450e7716422d7ad206648e8948befcdb75211379fa5898b7a41f53f78e566be5f4363ec2664df7d20a7ccc30f02a7b1ae984c1cad6cbfdde57a9e04a8cbfd5723d8fa11a229c462be09a213e272c1542766ab0453dca7323ce81e2a9babd792abc63d5f28bac0e1571bf8e54b68206bc4fdc100ee71f1cd1e867512572dac80d2853eaa2d79d4d92ff4213949b9c02896c8f83dca0c8eb8f8e6ae9829049d0471d131df8549eb954185aba849d318622ccd8a639823768b5951145a7842784fee3087944418ce83ad9e0fa3f5fdd8beba133f47b7b2e2883170d5b9922cd496a8d4fb0ca5400444344f6218e3e6518fbd0aa2d94219ed0562c2365ca98cf622cc36eea5606bdafde31a86ae4aad391633aa7695a2a5b153f23f43e91473b549ac8a7122b88d4f2b8987f0599a4fda156aeb8b0898616684acf6ca528c633dd1dec509041c6353edcdebffe782cd22c25807cc3d4370afc5afd439cb05a3196682606ebb9779595c21c1f7e6565521a1c7dd8dc78dff0e0000ffffbfa0422806680000", + "6efea0b1a321e915a08e349981e5ecb4": "1f8b08000000000000ffcc595b8fdbb8f57fd7a738ff0cf2327fcb97997a67a1c13eb4db6c11a08b14cd027d580430251d59ec50a44052633bd97cf7821749d4cd49da9da26320b128f2dc2fbf436f6eff0fb8901561f423ae33a5e0f9fbf576bd83dfe0e7b7bfc05f69865c21fc0647aacb265d67a2da70cc04236a333c77bb89a2cd2dfc59644d855c4700f0c3eff6e7a9df46700bbb35fc28a4c44c832e1118e50825d263a98172208c412ac549a1546bb3fd6e0d7f93f88c5c03c9ffd9286da453200a2804d7a0e84704526894202445ae89a6824356127e446528d277ef0da14d1495ba62f029027b322e4845d925814a70a16a92e1aafffa089b5bd8994360058c9d8009ecd6bb7df8323e61fa4475acf1ac63234bec844c60b7ddbeb63befcccecfd6b8ef3133d2a99733eedfb112cf680d5b117934ea4f6dba89a254e4176b0ab72b81ed6304209e51164c9c1228699e237f74727bca3c4769291f2a42f90190a1f10564822baa3472cd2e86dddb379e89d96699e454d58c5c124899c89e42aa612404fee4792bbee07028771d330527aa4bcae1a09c2d0f66b3a1742052d38ce1c1c863dc619dff632945852bf8894a2cc4796549bf270591b40d8a5d1f1286790277583d8696597ff78095319073e25fa4686aca8f8ecf0b67ca1ff3dcda26f3764ac5d998c8b0a7bcd5aacd93f7a538d9ddad1fcd9e37f9d119b4734b29adc6a938c78e54d2aa12a7e21c46771bf5db70b10f9267aa68ca7014e573494e7989926ac233278bca08333a0cb27821fb433a22cfe180d5a13be50d3113e1b5c46fcff5200a76588dd3f71793e40c9f9181c28a704db3ff4e2a1f25b9404ab2a7a3140dcf4d52904cd3675b3d9f944b3ad86dbdeac4f9b7db1f67820999809684ab9a48e4fa71e8ab80572ab41615a4429a74ef5208f60fb177c838264db2418e9990aef6066967826f056fdface05d8d92cca41f4953f9aba69ae1071f95866feca448800b3e7090adb33daf041a53954c89ee9d756d17e4426bcce74276ac960db153d798862a4df4485791d252f0631f74279f3da96039cac7ffa9ecc8448eabe829cd57912255fd3b67cab23d9754d94491aacce2a8167fbf7d1d1aae450207d5a4b6f29b6f75d01d0a292a2045619a033fce000c43658e79631cd8d463fe0ffbd78f630c605b652d1475b1259111938b66f5194d13222c268c1e790229516883d3e8a09ad487b88bed78bbbedb9b5e63df39d65ad4f645bbbeb98537558a798ef9cbf79b4115b0e96fb2b9220e48299a2fd41b5a1dc3dc55fac2d0a7aed7e12721ab172c95269f2ce00b708411422d65cd2c4cf2dd7426b71bad055f4594d78d5e45a2d6a6aed6ab4821c34caf22536f8844f29fa5510b18bf0677f6b06d26f36671806bffc6548b30614e5df874b5f50f006267d3b0a089c23508db7c0a21ab96db0894f5f27d0ba1000105923bbf0c44b72da13b3a88ce0910a59ca494517d012d5c2041c668f6445286a02f7537572c87caaf66db0fafdce3ab0fdd8244853a78564d5a51fdcaf5be769820758d441aa513701416edcc51b6b96a64a9499e4fb161275792c495f81817226b546c0f4f24bdb2c5cb7e6547abcd74cb627d8056e6a443d85e4ba5856c133a6b549bd10d57a821bdd837b5c4672a1a05b261c3f00d2490941fa77a2ebc6f955c78dd69387c6fd5138d36399bc0ae3e7b9c017fb2ec0c705c0ab645971514596e74fd3430d2fa7e6fa691f583fbefbbbbbe55cc610b9b322749eada3319cd03630c61a1e220ef6c4b3db4d204bdb62f2af783a46d355202720396458d520191085c68c848633ab168349c4ae4e6c4053ea21466c9100358e236d3b7191e91e79379a643918371c6c360af5c0818bb01559376a0e90aed393ed15c97d3021d04ae59bd77aba7926a8c6da14ffcd54c7f68191db5c8012c72b073f5d2f86aa17437e588a344a5ac05aea28f69f5c8b1200d0b58ab4c0ac65222bb06ffff9ecda0c1f55d80345a8c62effac0daa18651130e922004163ee9b212b3a7549cc33a4a722a5e7df84ac78f3c356a9783f06fa412d2177d5100e59974b71cc6f239b64fae8c04570c43897953a5286d21f435dd56c158d594c7a31e31dd2b1a3ddc6bd56ca1c08cd1c74340df4082016ed8ab26b3832b5e5e73ca876dadad7e4864565ee956264e6cee0e2e0c1ce9581485429d407c579fe7fc30696c41544c7430d0b4225977b73792b037a65b09a6c145e1c7906032a5fd7ba8c05adaa1538b4c6b690aa2a6a80ca183af468789cd7b150aca306e6a26481e06c415b83042983335cfe1f2b75ca37457092f82cee72a9dafb53d0c7495c6d5b6610bcc5113cad4f21de217e8cf0e7a5545e465489251a563aafb99eb67aab2971b57ae483caaba55cd88c6a1b0e330fd12b53641dc95ee87456271ff274e3c788acdf11b268ec29e0d665f922ac11a6d611c00c3a29d8ebb0165b7adcf6ea19b64b6dd52df57cdcae7285a074cc6feee89c68e91ab83c1b20ceb63407fefef106eec359327efb1c051e2c56db603826f9c199abc70ebe184f68756f2f07e27152c1fe8dc9ac097afee2e6befb5bca1bcf882296570d3d0b72f67cc9154bbbb56a840037bde31539ae8468dd98597169de0dbb1c6f30a43afb1b3e20d21c43d7f8c29cff16c7cda729748aa6f9001eeea336ccd27e4e0dc6409da72fe0f0368fd543189e62f333186842ddc9b7f9704b77cc60c28b79d2c08c9fe967574bf6a5f5a3432ce89b15bdb671fae77dbdecd57a33474b2953671839293b99b467aa3786ace5de658c6904c8cf8a23a3a7c95402da84bb1a99a9d60d7d4e93795068e0e93ba8fc7c945b0554d975234c7d252896eb8c851bdb34afbb01ac5290c63a82d64df7775ac05c4f125f1187a2ead3a53ec5dd8cd3b78128881785ff6d4e676e0ac9491ece9d1b7fb012555137ea5d00e64ddb77a8eeee6ed984b548939dc3c64e6b3e0e339e66bff03c6d071f7f7dfe5e97efe445250a9749c9594e5fe9817c85e9ace49d392799b87bf756ec35b877d5b03662bdc959f1ba241f5835e644df45796ba87c55207be4face0c60cca9fae8593af62e6c05192baccc6cc61d85bc26976dc995fcf056e1f928fd1e77f050000ffff222970aa71200000", + "8dc98ea9b53fc120222481e941803c10": "1f8b08000000000000ffecbded7adb38b230f87faf82d6798f06b04ab424dbe90e15c4eb244e4fce3a4e3671cf4c3f1a1d0f2d42123b14a006415b6a4917b03ff70af616f712f6c1074990a2ec74bfe73dbfb63b8f450085ef42a15055281c4d333691316788e24d3c452d7eff2b9dc8162172bda47cead1d5920b99b6dbad8c45741a331ab58ef2c4058fb28462f3e35b5042111ed224a59e2a2f2fbf2cd194d26e9b5f3f5c44d87ca2d118a8c9ba790885c7864d753ec62ce28f178c988fa0096696f0fb30b960c47c34c2a43499b6db8811f58181f97f8b1f42d5f6dd0e1583823782ca4c302f8ff128622041e04d11c35108991ebc23390ac7e68be92fd58b94348c81a0bf65b1a0edb6fd18aa3c59bb9d625b5f8a4238ea61151fe771b18d53a54e09a38fde95105ca0d6db90312ebd69cc223b25de5f5a9db0d3fa4b0b0fe55cf0476fea4f784449ebe3a7773f5f5fdddd7cbabd7bffe9e79b772d98ee547913a2da4e36760e83cd6e37547d18f5c6fe244c1234c9a7175c8c515925d180fdf1888e87b6a91cc90b1950bc830994392998b1db592855659eb89b72815471f1f78c1784a4370c5f093fa16c26e7c3b0d3c11c0935e845137668d30f46656b55e5a6c58250d46233112ee7be0859c4172d0c9c6c92f0f7f5d54a521605fb185066595031a32dec87cb65b246721ea7108a59b6a04ca67807a6c40f928a5072d15092f0ab20b620d150ca13b91b73d107f511946d35112dbc1b72ff271543360f54a431670ac83fb101ffd7b48541677132ebbf2d0c29157198c4bfd386de6c121e46ef055ffcc7d74f374edea9e08b5f53ce5476c905bde53500c94df26e0713caa4089358ae4da32e931917b19c2fd29332c934912fd598c59ca57ba06592ed0d6d1abf4dcc2415299d4855c0ac08b53014df5f6caa7ff2b38c93f4a492a00bdfede091decf1203f5777affd3f5898e3055ebcf0f6c99c9ab62422a604e5ade5876105f9c09c9a154134017126c1426a9af8f210b675498ba74cc492da9deb8861c7b89a6bba00722d844229cb148f065a5963cd294afc8d05542154a7ee6692c0b5c3383d9906cf2c97891b7c540ea887c78e4bb7841595a2bcc8db723499d113740f7e1e4db6328a2b77cb10c657c9f5067e477701daeb91ac7291713fa2e16742269e462b28a4f34500bc384b35486cce287c97b9247da12ff16d3c760734b573213d49d7b69a29c79b89449b88f1e3ad69dad4538a3373ca29f059f8970b18f4f350027ef75ccbe1dcae6a439399eaae8601db4a970b7a75f7fcb42b10f65a2eb7d6deea003a569593cb143a706fca4126f40ef749cc28260b30c454adff2840bb7f032d6ce5dfa306b28db8935250bca222a727cd53079940198a469518eb3a4cd6eececdd0e9c17a75e4497824e424923dffb9cd030a55e96528f2711159e25d61e9f7a0ff143a8d1d343afbc9eff03f6e2a9b7e699c7288dbc58daaea8e97a1f4e2417eb275b5105fdaf6ec8842f161953e4fdc991c8a19ea8beac4d5756ab0b3c2ebc7fcda55ca6c1c9c92c96f3ecde9ff0c549c81ec26fe1895dd069b20cff6519254dcaebf45ee4645e0da14a48e3c532a1e9c3ac85e18de08f29151fd89457884c196d3189150c31dfc1e6a96d2d387d014fed65c1e90ff0144d0f4e7f84666a1c9cbe84a7697b70d6836642169cf5e1bb686870368043e3109c9dc273a43f383b87c3143d387b018777e2e0ec07d89bb7e0ec25ecef22c1b9eee9de5a0dce0770609d07e7a77090bc04e76770808e04e7e7d044f483f317b0cf2f04e73fc001fa1f9cff0807086170feb229a946a08317bd3a5495f5085ef4a1996e072f06fb29df2a659fc293bb43f0e20c0e51fbe0851e2287ff0c5ebc80921f0b4ea1c6c3062fa1694b0efa7dd8633a837e99dd619a82fe195499dba0ff02aa7c7dd0ff016a8783e0b40735b63538ed43411582d3c16e0c83fdc346714614283ffb14074a32dd6e51c4279a77f7c328d273721da752b5f76213465110835804e12ed0814c05d21d86a9822e0adc3907d1ffd24ac4a2a18eb8ac83ee9587ead0a10b2de8823fd0a733646586788a04dedf24cc51374be9db70a996951733b5297db86ae121f54329c3c95cd7815a9cb53a6a1acae253b73d116d82154ded241cc45e6f897048bcc84fe55992ec60b31bc3e9f7a0037088418b0fb4a800a63081081258c203cc61060b58c30a1ee19e6c56410fd6416f979f6f5322ba0c2684762524441eb32e3d163023e931ef4c8ee34e020b921e879dc971d649a07744c8acdd563f8b767bf69af40859bc266717aac1019a92ac1b434478378425098fe32e3fcee0814c8f69273a669d25ccc9f45876a263d159eac21e4c61f376fb4117367f4d7ab6b035498fa3eef478023d42c8dac6aec8fa55efa2bb3e1904eb9301ac480f1ec9e478d98d8e13b8f757043dbeea5d3c7657c16367854fd6f048a6c749373d5ec2bdbfde4bbdc718ef9cf137837eb63fe8058c1fd199a094e84d3b15931313361b7d09754fe523a58cd1342d419dc83afc24e129ad42175175583ad11b7f3c89e5ba0477632defb069ae37d03473af8ae005ec7529f8010e141ffcb81bc3f973d8e98425a278331fd1f10919ec5c281debc7d198f42a54086f52a2e2214329861855e80756072d44150dbf0a2773b565a0100f27b928c7a46bf91f99f84bbe44182441fdcec3888df1c972c4c62048a47e38e90d792904ea74b859473111233e1e3e8ce271872c47f1f858eed8112169bb8de62336ee105dd6ae42a8f0e661bf3319aa0d0cdec44841e15a874d7b55ca50358d8cc690a8df6e1f548bdd3263059f8ce89810d2edb7db487f27a370dce9c3d45f66e91c518cc1829884761b2d475477271c4334a263031862bcdb1f4fae72cb31e9c152fd14c54a3c9c96e3acda1c92a99fcee3a9446a0a6c915094a6767c1a993902010cef769650a91e4ed49f887cd222637f2268282952ab1d43d218bb6c8c7d688c9d37c5e6c4afda5de1b438ef3fdb6e6dfe6f749da239ce0190c430dfa71c2ffee88298ee638bc68fd0a07eacc691a30a9e9821a7c46d588afd45b844ae503527f0233ade617f1a27928a26007aa410688741219e995590446db45136a1c8ed4e99a7c37678285ff72ea6a3704c10ebf6f1890c74a082a37b78ef60786a30fbf012d00016bbf577aa96621f328361ac11690586d4206d56606b56c5d6986405b636e1680cbcc0d11032859e6923724dbf1fb9641db90486e93efefcf087f087e5a273eacfa8543d4811536465988d98462b8124e818dd190159638be3296204b1edb675cfe5bc857dc9aff923156fc394220c269610a22062a6d86515c08284a5862666792437ba17ad06ca64eb48c5ee716057aba5969079e519d633db8ef72d669117a7811733f07826d571dcb46b2848bc3b34bc598d85cdc7a6a7b52234577fc861be3108d21b8a5739ce0f4587f4b1ec103a12635ff20f91eace453fe8e5132a6bfcebff5405ea8cf16415a1bb442ff24282de3ecefcf8df48737ac31ad5c9c961d1826258d48a1dd257b2dd469448ac0e038a3cd0ff9f3cfc79f2f0f2e9a9ce87e770b51bce4ae9993e39187d6da12b2b149b8da7a624b90f27dfbc38f568be7e25f7eea91716aacd96d12cc6848d64a1c88bb75b6462c8688c213643bfc90b0c044ce42ae03b0c74077c3aadb4d1f48a1347fd5a68f4a45a7b3c5f7a8d3d07ad165575e7d3dbd45ba3228d684225f574d33565cb9772a81b0f19e90db35761c92a66381c6546b7a93a420811ed76e8a7cb249e509441bfd052d21d4c63419d9ee55a445d9b222122ef07d543c887854ece56f85aa13a279742846b7f29b8e4aaf9b636a3602db2401fe361a90ded0d6397c58d73be4d8ce2f1302c3a60d581a13f912be04ee377b5756848de3e595747db78baf6ca13b6370d9374ed198b002f4c3d2388f1d2ccd80894ad6464a44ed0d05203d582169f4e5b63500456be6265db258ea788faf330fdf4c83e0bbea442aecd04ef37e8aba9256fcf3d35d5c7d39846e0a5319b502f965e98081a466b6f1ea6ded216e9fda5d551a56a05b8b3165d1e4a8dc5d0b45dadbf7271734698cf19509f4fa7ea733a552b3c169430fd037467d674bff7fc113f4795d6c80ea34681b1da712dc697d820f95729623633f820f5ee2e701513a48b0956e0338ac7b886f45ecc3c6ad3c37d1191c682bd8990b846528ac5aaa7c88cd050d382a2dba5ace981c791d73b22445c20aa60d47121505fbbdd3e3dec37a8e69db16b2090eef675d3bc7d5174a38e850cef6a32a87c1ad4889a761242241624377729c809bda081dea30a2b144e981a28b58de892f482cf09d75010eec751bedabe8dc4b822cc2a46e74631f38e1c0a6f1492a1d6641eb2198d5a30719a3c5519ef34b2a1562ac3fb84b6803a0013cd0cd8c936cb8cbacb2cb77250f4a915468aec12e19bba6ed74b7a8184cf7844dbedc47e294e13849fc4ec5bbbfd80cc17c641cb48c3ea05b4db45094bfb55669f17d9779f09530caeda18d3b73c63d2654e2284379f490f5865ff74176962cedaf0b943f439c7ddd3d1835354521aa3a891d6735492e9bc096a9d1b72bd476d6216cb373c5a23ec3d86a9a756208dbcc758cebd8c7d63fc9179aa935e1cd96d9213e12fad12c3a284dda46648e0212757aad637349537f451959c6b3c508c77925cf96114a9e84ba94eabd28f234241b59d4858208a618d046eb791f4e3f473cc188dc851cf15592cab4c15a89eb3f150716dea434b22c16e8b7a595c59c9a6eea6c4cee83da8a2168adfd2bc2d560dd08c744e216f4679da58d76352c7204c3fbe2e15d9d2c2dc1c0df1f057444160f86659565156372f27cba6aa016c9aaea241bc126b9a26daed05121a3fb8fae4fad3f6d8165c74da3651ba23382b47706450866abc2d8cb0d8b05c631f4339f717314316263f700f3098d3821c763a05c7638146620c31e1b61b4744cfd4c5cd288f1907ea5b8fe5306eb7638551ed36334c565c6ce2ac6cf3a26c738ee8cc5f84694aae15d2dc648b7b2afc38bd096f6c42c3d6aa86d153695e3ae75912193e90e9bc2d072fd6ee49469d060a5cdc6ea91f85326cb7cd6f91e0e45ed59a9a7766bb456ab98289c6e0f4eed1b1292b0fc6e5ee2c2ffa9d7c073c390dfa3b6d6ab7df41ada6f35229b289d611943c44c9891adcbe774cc196f3751a4f523f8d1759124a2e5a18aec8bd62f1afc9a35a590d5ba3d4c4ef6398a6ed36ba2665d0947fd3c8d87e239b1d28d2f72bb9f2532a65cc66a99f6a1cbd15214ba75c2cb65b3e8c10861499a22ec9511feec8269574e92ad2e32952dbd9678bb547bda139f15df90a12e1e19d9f84a9fcc81f28a1506e2b74d9cad7373df90c92b057c4eff5f3b1be3c224411934b2241ad4e0c7207760d16763d0d522935ed0a8f77903e016cea55b043a646a0d0071b3696c11eab7c8053862b3f660f611247a1a46fdef015c2ba995a5779b8e66ff9e2b1a3b6510b32607a5daad683e401f325d73dd1056a9cd29602fb165a86d6dbcaed1ea5c86c20601933350841551a67707c65b6b7a14be38fd80ee2548f9b8e3930c42a5f916b07519c2e794adda669ceb5c26014736fa1a396192addd24c7d192a1984502c81e0ca5a0532c891c8d141c5e80ec35d55dce0f27a8eeaa328f1e905678fa00d068cb0a9eb83fb03385c52d07fa9d8cc06a56c813ea3b3f1e8a5b670b5969c1553ca4d942d035dc67768f272fe9211b6dd729044aa1f415aa9e6e81d73ea8bfff8fae9c6d7e60288e2c01c1843c8488c70853d353c54badd3a318ab6a4fbe4cedaff263c8c3c631da318179e494f17e1852cd2dc4b6a8f6cb9f1ac8e2bf9c63037586696a54bb53dada2b169fdacd0528cd021c2ab392545c242e9c5a967d767e0dd180e4ac52de2345503838799e220f4c69e2a3626d5fb8911001546bece865bb6734aa46534cb764ef7da6936da16de6e1b12d5ce7bb81baae8fd6ef8de1b2ee79e29570fad2ac50b05cdad94a3bc579a4d9ddabd1ea67aa387a9eda05d4259ed785e9cdbebba65775158c35c674d14d60c0a611bb4a0eed9aa2e55d49ccf764b5ff5f647e283e9b4650e3c7516b488a4491808c290412a7b0ce9f6f5094414fd97203b7d0c6504ed48a09d5aa48e2af67907b8db87c131ed2ae09ad0f3cf379b11e93015aca8ac07baa23282e675b326218aaabbbf5ff7a5f4121aa6d2938fdc54ab91a390bb4db9f0267cb1d47caa9dc97c3415a35b1d4f3d9a2a2c88ecf48742c7082c8fb4c08a3b03281cd3f78abc5b16ed3d927abcb65bd9346806eba3c2fa4a37bbc0fa9bea506a094338997bcb50c8d89c6a0b6672a6991de1c979c8bc9eed9e367628ba6745ecba332acc091df257b423b51a372efa258017fd8a6b42f6ff1ac4150501ea6190a45f8cba839ddd3e38d859b557b1d294577d35ac0df870a0256a0067228e2a28508e513c457d42086db7fb46566187c06d6c7c60247b43fe4a96eaf090880e3fa643f1baa7ce1879a74210ddbe4ac0c0f7523a8877fbf89816742aae5ad1e4263a79b7b75bf127fa7e5ae9bcb58569eabef929c4ac993b0a99bba7e9eda11c05aa474185adf8ac94a0a6243ca6c712a68477e263da49877a141cc20dbcdb374918e2bdb40e8af508a9d4703f55e543a18638964dd47e6a31f88f60af1ab7fb3009d984469e149456d119b839a62ef9231a0035e8dd33c35862793fc7725eca8a6222212483e31832f557119aa23731842ea58e212bba236a22a943dda9d38e9252bc26057d68d84cca6568752d0d4b30324b704f7156958ee99278595287e1611348a90174a9ad43663b0c4487e19dc1fdef99b94912ff96512dfd52f36783b198246afae229fa4eaa61327e8d7fa70dc5e4edd6fb071864a71ad90592101f4b8bc2654fe2631ddfed97db86b311f2bad84eed82dc15b859eb3563a8f79ac806b674ce794abd7411260915debfbefdcbf73eb802fd2414b37c97a863fabfd8bf2c5e849041da7063cb7ea078bb3d1b609816c863488134a4a098f2b01ca4895926d3842bf2793250ac4844fac3e8d564d8e944b85e484650d409f1bf4b637a696964660a7c2a633c45a9cfe84abee3d97d42117e65497242c26151aaeee592184824313c90252124d96ea785e43981a5391eb4dbd352329260cb152b1ad9ede30967326619d50d1b3e0cf1f794aa6a9f133752f5cccacd74cc1c3b1d5779f2f53fdde597c0c228a22290903336012f3edfc48645a0410c39f17a13b35b416930856528e7410893584cb22414d7a620016a7b508752b54b042930ae7b1c4ce0319432fd2a059f85f2f720017721049151eef27d5e79e8f0d3da3ea838994ecda507ad99386c1c9c9b02f7cf1587fd8cf95c2e656859991a71d50b1db544de8592160c287df43862759332398f533fa534aa6adead425f553a8cb8c7c8e05843ba68a6d89503f194b063d691c772f8388f138ae86bd2df6ef5265172c4c77a7da4bf0989ba031348f80c517c422b9a95dcb8a0686aa14623b433e80f7e78d91f0cfa671d445fbdea0f70fb6cf0f2ece58b1f062fcf819232d046a7a767e7bd1f063ff47aff49ff93be7efdbaff12832ae4f487b31f5ef44f5f9eea32ce9f2882764ecfcf7b2f4ecffbfd17ff495fbdb2059c0dcefb2f5f9efef0f2075dc2e9538de89d0dce5f9e9dbf789937e205066716000d5efc78767a7e767edea6f8240fbc68d6f83824666f1e8e69dd28b97226b3e8a3982cbd924bfbae6e7fc85ef786dd2ec392c46669337d92d2ca1ed08a373a62ea8b8d8928e6c3c5ad5cfea408b8dd6d9df2a52e5f629197af4f6a5c1bbf80fae3d4c481218e8779ee769b213aea8d8dcd524cd8762b0c2fd7a0b837a537d82a64a9e48b2f7ab97911a7a9a7768b452827f3f20c75f9f943e0e9d6e1f26a7645ac908bf58c302ee090ceb3e934a181dc1d90509915de1095dfd32529704722a9aa27d95e94996312561232164fb958d462676196a671c8486c95a2cf18213a21869c002d2591bff9f77416b39f97512829794fbec16f3e65910dff443ec31b22e11311f09bd674432e71fdcd157e19eaa520861acc411f69b0f58b35044962f62da0506a0603e62a5f45155a6ded4f404f0cb42b056bb054283823234db23601a28587efada45c92a8a2344052cb5c08834f48422bd383d1c23840525fa3374661f0b5d331006114b530860f461bf713c2202bfc6631da1f2a5adda424fc51ae6acce5cb477da775cc48adacd6cb86b4c2ae6681e668fb055e203912e362efb58a2ed504f8daedc227c420d7d662dde8a35e455b68f0296f85d06ddc6e15df0e9c4488e90053cce3cf16381fc1db5c210521121063a04784b0763b448a01843728b663a6ab8d2b8a45d708c2503a77dbcb1aae98cc9b3201276febe23ba187986fb76b0d82377cbb456f1585eae572e4d6ffdeea789d8e8a1ceaa23a31b08ea3593bd086596d2a73f00b3b5981bee751d5cab9b684477d2b68e288c2adb1d37cd5abe002dce6c6460cfa0ede163a4f3d43b9aed3a2b27658a1ca94565309ec35e9b5db36e896884114d0a20a2d9aa0df20fa04feac1dbd85699955a56fb747a2a635cdf1d89cabf6c4b7325792e6c25b6344c54bcb4aaace29b921272e845a4ef9ae9651e3347c6c321cd8e98e34e81715f3d46cea42b1d9717b20c96dde68a6f9798629bad517078a02efabb89a0f8b28c6b8516758f4495e5ce7226c50e31b5c5582653d57c57690d3077bf981365c7ea0233e8690c4aea96aacc733c8e3742389441f46e118625ca80e1dedf8f51fad521be23975b6dbb68ad85a0bc4b8b1a21b843765e81bc29b771de2588f7e56315dd2d7b789deb5db5f729bba5ebb8d7eb32aad42cdf505430e407ace08fe5aee918e25d1c565e0a8af2e73273887d0a262a4a92d913ee043666ee8c3888de478ecf4b9a8e8eea98aacef1b8d86eaa4ffa128ce2d6b4709dd6e373b68654c1d80d4f1e843d48a8da67ec259ca13ea3f8682554f4281f755aae3189b6915467195bbe7f7cfbc7fb965fdab760ffb9fece7947aff5a64898c7551fff2f8d2305e2c95348cfec95ad0d27f6eb8a48127e75450554898a4dc3333a43a14d1699825d2bba7f3f021e622f0deab9630fee8f1472b55d615fc93c5a9a7ba1247541416ab8a1d0cbdb219defdba2812e9cc349ae97a4d6fb0dfc240fd3203d1fc58d14f0c25b7e140697b0727d39125d21f9afcd35494fc170d2aff60b3835b321ac35bb2d9c157d28377a4071fc9af08c3cf957a2fe6c1037c51a06fc80d7c2237f09edcc04fe4067e231b2bcc0826608fe3c112ca837ab0b0010d93e4dafa20828a30a74181fdb5d0991f04c989610919ccc031dc0a3ec29ec57570efc6058fe030a7c17b2818d3e02798243414c10aac142258abafb2f526ae503c4fd16f1818c2f0dbdedd0197ebeaf68d814ccc22bafa342d76a83c22b701d5a2c77c013b5bd75076481f5b2364cd8d165705f20af6ae16e8c39eb6e6d25f256f67c28611ad5d91c51b6b3074915b175943f8c086c9888d1b6fc9ea322dcdb535ea8d9339b549c8db24f64e9d85d96b6e7c8a70a7f5fffe3ffff7ffe5b53acc89dc53474ebf4f47af15e8df713746cf829a2cbadd224a363b0c4c935c2d33657a0e9aec557373abbd24885de35508c911df6e731a3b92e32342e26178a18fb10a22283d9f9158ad7d6dc2aa7fc05828ef9a54b3f6e0f61d3739f41c2c794a8cb84733b5264ed087cf0df1fa92bb8935110f34e1fae6a813a74dbffa7b8b80b6dbb9ecc9316d358288558358ca5f5d507f15f44ca1eb2688f505f5d7414f1d9a0e9572419f28815db0a0b77f93bc3630f6c678c3d05453cac1091b06276c1e9cbc88ff85c363207e6f82f8fd82fabfffcf0ee0c1f2e58554c35ba2e6c61a20fd8d4e24178328e0a0624ea320b671a75110ee40b84656a52116a91a2cb9d3e1af483e67fe2aa73a79daba4c5b13b6abc83b044da924ced66207c2f6b8b783f83b1a53e2cc1f6e4e35edf732ed772277107e7f53ed2cf4f29b004f5fef6992ee516064996f39da104d51bbb91fb3940af98647314dd1120f59b73bc494e86bcfaefda5b91d35b12d4518e6be916ba8497eaf52b411b18d44d4de2961e4a138d4a892173980b9115d78c7f34f92f8fec458246ae7780eb55f2d79aace88ae458af5890761c3b6306424460c36a6b46b731deeb40726fc96d3e934f89176cf6026c28758ae836edf1f809c531906fe8f1089d002f9bd81f612f655d26530e8edcce69d116659adff330ba35b41e9765b36e2b72c8ca4a0f45e3bb22b40dff08c45a906345dbdd7112dad47b230ef4438d323e98045795c0bc3a48034767375d8b48c6d618888623b249d6959a20346b3848a0f454a0b43e234335a3ba065640bc352f1880feacf9c6488619891142dd5f6b1205a90b3260aad60458e7af0487a704f36f71aaf8225fc66872a98db69488307c82d51030675235369c5469444aa0e3f9f86423431cb1149df04b3c6ed15e3c503178f149c62d61de3295be432bf0bef947829bfbbccdc3abf56b839c3258e546799735bc07650dac8d72b2a24424b977d542dd0b21d5c94e68855f499755988c767c56a552738284ce7832af128f4aada66a7c1bed91afc8551a4a5219e9942753ed234c1730d2af7363ad96e2349baf63813ea0d33774812bf26bd8b38e8f61dab9b87c22d40a879ff5b2ec3e4237fd07e9c1a0e0a8ff920eef5ad3a8c0fee30e69cf9eb6eff023d5486f0a8870373423386b80d772a9a8c6467cefd8be2ee05b516af6ff8aaa1e5ab761b3978bc52673e98f9f77cb583aa91b19b59adaf5d41bb1a5a52dc8ca21788f916905098fbe6fc9ca24d9e9bee0c7f838302706729e1b3056bb06ab126a75ba88ed9ed4a3fad0cee3184e81ec37d8dafad12c660a01d49d5a85030e8c31e650c06033840db82c12954f7966070060df432189c3fe1ffc96e4141bff784f32687f2078317bb310c1aeeeb355c0eacefdeb9929339bbb51e74d7c8c45ebcf878f98fbbbf5d5eff7c05623f8a17511f6e6c54b81735a46a5bded88d6d44c7c3acd8f52f5066b99cac647e20b3dc4d19b7c601722088cd050e848d5b639b7df5ca90051b2aa25f737d71b516bd7e25b474af56c8fa75d86ea3b088dec5feaa4f24c4fe6a4038c4feba4f84fa1990705f515fb7eb381b281663b3ea073d58ab3fab81fa1a94f6e79b7bbe0a62300b3610a0896be56a84aa5f57db338dd075f75c32f2c41d811804e9694fc3fab6a4bdd8544cbab9524cdd2bc5a243e8281bdbe10e9dd07a284e4a2f1d61f9bdd317370541cc5ff53bcc5f0df0c90042155eabf05a8587c6604dfa2e0b950fc22a101d6e54b529eea627035807613566a7fe2b0fe7a55b33b52abec349726e5ebf14f12296f183b6a36cbe57eb285684afaf9a51ecd6dd5054d0ff51b5a3c154bf6975169e33f6784fd1c0a40e19918af7ac3091bbfc0adfc6a28edb819caf5e7509f38b6cc7b43861fa2bc861d60761d6258d1588018751ab806b8d3170774c9e22676a649ebd80502a667ac015ae1bbc85ac40b3a1bd2594e56c4acf917365a5562635dafd296127e6fc3c4c9d8e77c8f438cdc7079c94b59bb21e1a232b3727446e700d09294d4c26c7934e741ce161a2afc9bbd9c8e424a9d443a29344cd343bae941e5723d6608f831d22ece7ba4362e01d536d789f2281d5022d82854e10f163de098f437c92ed0b7a064f9bd6175edd1cc15c2996cbcf9f563b61c5721385124498c0238d6773b97fbae7173ce83734a7c10ee9cfaf992602dc74f0cbd7947b7e1ba8f35be580f7637e3e8b1b97996d901e22558b2fb93a50dac179d5bb6015621794b4937033b75d996f6b36666d63d6903ad8151e879dec38c34385fea9de9f90a85a45f9e7f8e45cad9603094dc5e56ef8d36e0c13828ea899c8edd67e383d302364e3f1f1f4243da676a687325f4d1d32390e210fae5530035ed22295ca4bb23339ceaa5c5c0ca396535d0b5aeef02992137f2fc969707fa970ed3b3c64e5b445ab1ca9e6c07a41df09f58381131a04a74ee8b4a6542f7c15548a23b25a2091d5228934856af58d2e96c8461f108d4219321b2d8a9baaf402e5956af97d5ea31318b881d33c70cfa375fead6590e6e71ff6f717d2d3f7a4a7da59975ef00afd9744e594922f480f07c84837a7a05a4428864e6701b4e645ae3013d3d7069696e6f7604afa30213d6dd4aa8ddf47bd31590fa796b17c20f16832861979d04d1d4ebb0abe438cd1c282cc14773b9cb5db8b0b24c9cc2e376a979bb0316b1bb3cecdcef5fa90c7b2238e8539f972cd53d66c60f355250e253415878191e478a6c7efd80ce389a2d4c75c9371762c21533f02070b5de98319f213f3eb34de44fc524df86fea037a30f3dd7dd0d38f4ff8abf905523d7bf89e9ea107838eed368a47d198d8204c3ba40f5187f43198a87e15a2bf0f31a8420cf6214eab10a70e04c63b5ad2adb064873a24abfb54d418fae461a8888abfe77c0469c9d31881666a2499f64e201db19cff9e9481f5706a8f2c530cd3d7b1ea9bfa9cbc32e79b0986893dbc4c8c14342271574042c2aeb1918c5e271721e19d288889d0ce557bb0261261589ba52c606d17730c6bbd9c39acf3051d022369b76fed6fd0da9008d53c2be1cd90b6da5ce39a31a93e6c1452232b8a5903c5c3a3073f4eaf164bb9467858ca548cc3cc98307d831342c2cc1ad7c619ea2b3f5bc6b578eb30c21c3121547f713ea8a7c3886f72a6ce457748088a2d4ec706a78f27b024ba4cd5f36eac86021f4f86f9d1d5807592e2dcaa213a4b505468678c92a7af7bed76ad2939073bdd4b31e47a67072786ac18a81842bc2b3cb9cc4968316366bfd6c3d81068f3d309f50fc4965cdb5f1b7d3cb709bfd8845ff28499a59b3dc8bb078fc5b87456ea40776fba0957e5d074eed5c96efefab1dd460bb5b656e4111e89cd8661f6facaa4a8dc577045f28c86f5b82602c5b0c0c3eb0bdbdb6b087180ae35525e1ba45cc1b546c57bb8b6c8f908d739525ee9cf684d42e0aa28b8c678b7dbe93bcc9b1d94a2aa7d55549e74517c050abbad0caa015e275cd8dfc0ffd19e680f339ffd973f9e61981a5d8442652d70d721a322f92ac3c9372d573791e9d77051f81ab04274dbb65c54ae36d409cc896d06cc5474b19087c50331a50626086146e517ce9b049deb1dd4542e410c56f6d624aea317a8412d68dbd86ea38414210c0d90bad1ed369a13fb9d8bf50af161626585f3fcc05f1dac60a09d02d7862a18681ff37a8c83c1cb03dcdfd33afcfcb682aa460daa55ac2d3f44ab9a6fe04299a8eacbcf4686fe54ecb21db524d95842d73007da915359d90ed44a6874b6503670e464180fb57970de18db121c1c807695f49d4eb5625ef7cae124bfee15962365c1ddae5bf46e5f7c551d45ab6b1c34d81a348962ca9e17675c759060fe4a9dfa9cb87597f9ebd2c4f4559f767f6cb785fecdeb6cd06f36d4695b5cee263ae870d045b85f0b0f6ae15327ac0974affcfe871bf8250f6872d7cb8fdacbfc3367a84dc890c05c6b7bfa8cffb6efbbc503153571e1cf9055eebfb0bdfb2fecd0fd17f69fccde7f518538f75f58fdfe4bb508e6de7f61fafe8b2ac0bdffc2eaf75fd8a1fb2fb6112fb07be785b9775e726aa9b8812662e75e7f31175ea0641c1a16b244b8e6aab044e027ef91c8ffd67b2475998a3e79d96bd8ce251aa12fd108cc89691e129dbe56988ff818d41fe73a4d0c0cc54d97688a2b2bce68597eda5edc69bc1824f23ad9fec59dfc62101f3afe211d9b11fbea9ca83f62c7f325f3b4dbbec64594593f239a474911c5f58b6e996bf336ad0294c75cb28923ed9aaf107b94ea2feb8b0a3163f066c215af0da1538e31970b724b7bd096d1c6d2fe8f946dd8687da7250d466330170346e31da40a63639812b9dd86cfbb2cd7d72a3906ed19c6388c89a76b9435bc6f70faec2323f99ae156395dd8b6b22637c7ae2933cbef0d1ff2360a997ee971d8523d6d1142c20b73ef006538907e28a5d0d76277fb3e9179edf292a3c3dc6ed10389d1122bae5d9746312c6b178e543f6d8670ffd9912558d3b06583f4a8c8d6f4fe48534e47452d2a5602e1724959f4761e27913116a85f5cb2900335343507b017da0cf8881076b1f4532a2fa514f17d26e9cd57642445c070b0b48ddc4fc5b054c9b3a69cb8f972d27e13f66a4ea1b5d237b8e6824e5b876aa942d5bd2e36e8a297bea42bf99633499924d414ea44edcc8567edde77df43125edaa75dfde2e11aa371b64f47dd7c4559fe4eaca73573c5433c5537bc0fe5d41510e4a8074b8daa6402f99492292c35ea91084c4349024b9f3322d5cf744a382cf5baffca336d7708cb1ab33ae18b659cd0d274ca46141ead0a905bba5826a1dc07bd93362537a30aa3a8ab75dfddc4e26b0b43465a732997c1c9c9e3e3a3ff78ea73313b19f47abd93f461d682b429b9fff2e5cb133d85ad52af9f3730382d54f27b0d094ecfa0a919c140d1a267d4527823c5ba38fb688204218a8defabf7822fac6d3185961af293d52269e162ceed64e3dd44edd888150fc635f8332ed6eb5f568b84a5819ae7a746c9d3604f82fc45bfa4a0b90574f29faffef9d839c1152f9572d41b17fee1730a9f66f7a914a80702775a5eabc3f4df225ee0dd21531e3d285ecc9699f4d46804b9e31dd5d68b96755a1e1ba489f842c3dba70635b2f8fe49f592bb9e69ffa4159c6a6b8c4a9ee0f45c4de033caace79d92e74721730dd4e5021df2cdf0461bde54f79a7d07beb474ab4dc743e1bcd7b13bcc1a52cd5cdcae971404d1ae62b6db53f5639c271b59d730f776ac69b7be088170a1eff42745acde198d5e3f75f5fa1ca5a34c3b168ea7e8d438a43186fba0df9c32a4322d64904e9c53e4d42d32465355a4bee6b56bb08aae4e046bdc3342a0a3d45a6d7242fd8730c9a8f1ab6eef65718bc2997d49daeee6d44ff8244c6ec2058594c4a3fe18a6242decb15a7e0bbf328f234cf719eb82967a934c08ca64b22ef9eb345b2afcf3184d157f7d1fb32866b3dcedd284c8513a1e4e2eec53330207268a8cc478b7dbbb1551c52233d77f539d246c148f736bd532da99744e44a5efe590a8de8604c5b5eec2ffc6b423edf022ccdf1708425d0fd9f3616ded4e4f361be4772ef06e7762d9b3a7fd42e49b65933ffc779f3e7ed6ebf36253239001df05fab0994354fd2deecd4f01a70e32ce9ca8e9586bf983a7a8fb948b45f1b6265f5275ee4933eae94b5b87dfd0749ec2744704613b024f6b098b57989d87adde96af3f73302f893851719dde1b9a94b9ef74395c5a58f1a35179ed23b30f80552e218748e2da29c161535d06928ee4b84b2bf7703456da0e7da3eb80815e818186daeddf364414fb29172a9b7ef447627b8828c5a0e5a32afbd47c1f24385343fe9c68ceb630a22cad5a2842f5191ad7ddcfd095af5ddc843701bb28dfaab14027481e23d9ed631c0c8e9f486d72007ffa071f3fc9cd926267170e4bafd03f7fb0be5463c25188a1d1532f67faee63bb1de79fa8883c98e59d08672687fa4279d41355f0655e035fa23c0a83b09eb063ad914031b111b8dd46b12fa85e89a8f0609da75a2ab7298dde6216a916dcbc137c597367312c8ceafcdab3dc86f1ab3f0eab26e2fb9e26d15ae60cec1385a40709e9c1921cf5e181f4604ef6cde77afa666ce91066bbb56cbd662681facb7046ffb1dd9a8f5f2eb43443c769de4b47e200517f92c494490d693e7fc1fa667b91d2a99f17ee79b4f6d389e049724da7722fbdc6643aa0ba6a5bcb53c5def2e577967aabe67ec4408e7730ab5e64117823db6d85dc9b55c0ba11ac03d14d76faae00246aa52c48d5342d957cf959f06538d3af035fecc5201c507f12b2094dde64f7f709d5c6c9eb5a314ba1e7e09db935db6ed76314355f3599f569cff447fd1d3c564bdc9b5dc5d617f303e5c4ede09ed40dc2f7322f71b53aeb1c413b04f4ef3329396bb7ed79dacd68fd185910c7ff4754e20a24e504c384505f866246a542ae544cecd401d35238352d6a52d49470fd5cc38267a97191008f95b86cd9822b6c3cf7a77be757ce529ad0894c15a5816943ba5a9826f5c9bc640513179aace0a85f98c7c3d533b3c28d4fe8bd5e1491b61b4fb721adb5610a1323ae17edb6d026f6d715339be68bee19de684d63a5816c0f35eb310803f3cdcc1a4e30470f1044dfe1e044ede2da723810a3deb8cb47bdb15a59a3befaee8f77434998ff38a734794713ad952c0327a72f7a01d36fc3c6c949f72564fa598318ef767053e9d551d66eb38bd623bdff169b5ba3be7dfbfaa2e1655c33bcba9e165ceb496b827af7e9e34705f855938e1c326bb78f58bb8d0e54d624d86aacaf11b0b14a0c19613bf856d327590bc962317559fe858f1b633b45ec2f45ec2f0eac1bbb83cf75d26056bce4d9645e38aad62f55148eebf3c4516f3c5434a7a81a9c827349d1a0b138435cbe21b72c2803fdb179e141be7ab810a4db0fe4eb076d49d2c790210a425109376fd1827553f42f3b0c0fe51b1fda38fad74abff5a66a17a5ce6e56ea675c89a42c6ac1afd53843f775747d455eba3329cd18eaea2122d2a18df2cfd0c6e5768b96e4a86709e25ea3d97e9bd95e93f10eee9ab69c261cb8b8d4db4b39b88604364e70bb8dcace3e3c39cf18ef4a59ce81251cf147d6827b7df0df83d06569a2d8823b0c1bcb5b36e9c798d57defc0f0934d30d281513c64138c7061f4126e82ba519d376096d174954a4f9110a7bf8d40b52e7fef0ef33f8bdf37460ed5702ce7561a665eff2f78b2e2c17b7b6fb580b074f4039bf2aa38cd244f631659cc2fdea828f8e903650467a7f0541382b33378b686e0ec7c3786b367df182b153e4c1bc6ab651f93cd0ec2fd37c3a5afe7e01d7f64f5e7610985d05f91927e86feba08fd0236a77d741d89fc06456c1ff0c9e581ed362f8f59c5276210ea3b8fd814f373f5c15b999f7e3e56ebb0ddb1b4be56952243c5712bff426e2d1ff943fd15dc523e24493c126e798a132f8e7bf917629a352f76b6d05fc1ba08ffd20dfdf50e3f397047bddd0e43edd0566b943d183260dbad3dfdd9b827f0fbeff4fea7eb93477a3f4b3eb065e662b8c5cdc310c18bbec2ad6795b9f5970272d773233ade318571b05984ab7f04fddee00c16e1ea17f395521a05ad775452b188599cca78e2198532a369ea2dc2887a0bea455c4ba35abbdc235d8c9876b5a9b90fedf261cf46f46044611f5a8f50fcf86607d386bd4571885655eeab7e60c5263a11bfa8cd7952e381a8bf7ac5fc555fab84577d42fd95228eabd7cc5f0d4ce4208f5cbf62feda40ae15e45a47be66feda40ae073a7207d19f762a9454fa1559549a2a7a3f41360819dec1d23553319aed9acca7dd4699ead1de1867aaf50db1abc1be796ea63ab5175b557e276ab37fa8343cb50da7bb9a2ca174bbd51b32f7b65d29bbd2cf9ed9d7e850fedc9d749fbb4bac89170eecf28a46327ff66e8cad33bd43991f90492f32a7231361c433bb66057f5257f03fa888ca937f730c1b91556f1e5af330ba5447f0fa25fc5c9d69a8dc738f12658dcf0251f75920d586679f1b525535bf62b4ff1e94fc8ea797d2f23130f3ea925a6db9d343c975507b3ddc3df58454c5ed9e2e51bf49b8220c84bf2652617c124e68add985087e7fb9d10b342514d4e81ab3caa9e6ce9b0970ed1a557cd892b5c64f08b588f718883c36387bf9bdf771ce9e3105a9398b2ddc5156df3da97073e6e153b68ba78503b984cf50eb761ea7de82ca398f6a3ee172fd419652ef6ff14368ef6a239cfb846b61281fd8a65690e318d770963f706482d369253c8d052de5381bba9294450db84e15fb1ba8e220558cb22e6917e4195853eade05e4d25f49a3dcdd756975f6b4eedbc83c1ab43c46d8b1dd1e59a947fd4122163ec433e3b8217f98ccf29641ab05d6575fd0eab576d61b872da7c8e76729159733ca64ed2978464e90111fe091f7cf93311afdf3d11f77f00948728254fd214617817f6c2bc1173530414ed0228d29f6ca38aee2f8ef7192d8cc179e7808f2747c71a22f22d0159d685fb3b2fc14e5272d157113be588632be4f680bbfd2af151450a38266e403128ffae3edd6199678345011bdd6ae493375f6b4b6bb66c8428a29cbd9f78b30d8701670fdca75bcaf8f2e84657bc7c2aa2bcfb806de74aad239acaa56dbbf6749e2f077c37af7f64082b31f5597bfd34dbd91d46b25399f4e532a3f8782328923eeb10ec9238d78bc0cdff2a5f5216f45b188925a0139ad31e2ef3d1dd0d9b3feae1dff2e9b054dd3704683dc646246a5fb58119f968f3b7a13ce6418332aec422995057f8f233977a4fc7f35f7302d6e25742a831e2822d18347051a30986b909aa6c5f6e059d7765a6fa2dfb581b4c031639c469d94ed56fbe9ad40ab38a9e3582d8e69b3b53cae2464b398492a52f33877b5b1655270aa1afeb4faade0900b8ce78674f2dde1d7fe8a95f68c46a9e2bb5071d0db6deef5ac4f5811580d882c5306446cb7bdfd19386f3820a30396287513c4ca06c949e80bfa5b465379c9e285d6a6bc17e182aa7335458a7cb9ae845569a1d5b4d4e03906eede7a50c3c9b75b86ec4c151b30c2b0d1a32a41502d4309c46e573d7219ec45b9b539564cfb6dbc50243d7f94365ca11ef45f7411eb66581d9a433f35403c93c8e5fd10eb28c6a8f4ec9d11d691206a2af6d0d7de38f312a8f5e7af1f67ea414a46ad45da82d682ffde825c260d2dde1adbe7579c9defa8baf35d989fa009825ed06053363c10e0b622103b6b9e5a0af68e0ecc5869b83a25a97926bf118e84a369a7f5a529a93586e6d93579de36a4b4c6dbad9378a0d89d638fda00b0dda2438d95f84093749ec6b6f28a95aaa8ae5785ced8be353f8f53689a9359c2efc3e4c2fc34ce5a4a93e985fad3985a9df5cdce5288f3a7250f4fd9c9d8129fd98c2d5bf47d5bb105fe5fb8119f7f87d97693a465cf38f6b78bdf1caf59af492f68dd739ed0d0b910f1db76fb5b75d27f223f157ab68a321b3e914fdbad1a864dcd7703d49d3bec30bc27efb7db500117db6bf0937e96bdcec60aca222ab431480b6fb788f94e0c39ea61a3e83391c4f956f4fe6782defbda12f263c8c2998a4c31a2f0be62798c37efcd53175f7446ab162c2a69b7dfbb4184210f5bf33f78ef5316e599dd87128a5dfa1fe4933d8ab7db477f83441dbbff517b35fdcb768bbe38079a8ba94b70154bd5257da0af7a39253f2a1e5866bbf23cbf838feabcb9848fb8f21202defc7dbb45ff20477df8e2db3d02e1ca4305e6acb17fe3b21853ab433581d7bdc2913925bd217de5a40d6987f471de67f77583dc3bc227df9539e853c504fda4762244fdd5a043fd551f9f0c40a8f05a85d72a3cfcab650bff4198afb9aa934117c9e3bffae9244c685762c8217e21cc37fc96021105885013a6cf616fa96264de1a210a2a4a2e4bc0f00b39ead75e31b796ac7e4d60618d86de17af845509847ec2fc7d2e9d36008dcf0998925dc1875bb27d4b94551f0e704a3600557fffe60a216a99bbaf0efafcec5784c96a3deee999f04635c915ec208ae1936fe53888825a847f23473d982becabeba01ce1caa131fbe4a70df120fc5547faab133b7120fc7547faeb3c6c2b4d4ca555a516deb80d641ab4bfdbe1eaa30478b33f0046175440dd68ea10b3582ae4accae5d67b84a22aa67bc4d5b7088a39423f61f74d82f2729a16240e73d121734587487ba2be527f7e69b71708e3207f62630ff45a41add41f63c4b22f9cfd45514e1ce4efd7d44a68b79d228a7a2b2f20386e7792987dd3d72f6cb3a95312ae0dd02392e56d0ba7fd4fe5b9afe4295b5cc9a3cf752de302de53842bb758d536a66a97a291efdd7e7af729f03ee451de821eb56a6f36580b357b27ae2228668aa61921311899efc567247190cb7c7f550d9dbbe4ee0ee1cd0261a8d0c00f086fdeb4dbe88d63a8f786d4f0eeb62e5f8d5a70e9a4bf753dd4dba950f473c8c86615c89c34c23a900511dc59fbbfe261cfbe7f06f4a2eb0f027f50f0f1767591f7e61709b57cd486f51ff973ff2aba05c52ab41f65dbbe22bcc9b47c5ad034fe9d6a6dee0775ca40da73594b61e01b12a915f526d78e55c5c1ef7d29429626a1a45f688298bf02e6afabedd045294a8875c9c644ce94bddddaf24d0546998dea6cd35bc45ef540ea02aa2bfb0ac32dda13b2bbe3ff0ee1cdef6a2f5570aa6f99992ca7c7ffa163307cd18675a82ec4770f967b184ff1aede26175ed12e5819a84fbe15cd230cdfecb9f02339ed0dadf3052db4f819bec01bf844989f846b9e49786f5c1a2ce7f124859fd4eacff930f88d9417fdb49b61114e64fc40b7db4a1074f7152101cd54280a0b7f577ffe4a3676270d7a6077d2a0071a4b82fe0efe8370b4d915f761eb7a0b8b87bf6fb748f1623384e1066150ebe82bc2aada1e8607d70aa176d7fdbd7172f255a3afc99823757f07cb30abaa31feaeba904f922e2e5bd4012a3c938231f3d5203e4e50deaedf395f7cca9ad4296fd1510f1b800fac39bd6fbccbdeaa5530e562d100f5d71d28f279cb83fada798ab9e9d29c112ad99c2e3b2e56b3de4e73d62c9ea40d15bf37ef7668446a48fed4a82c7a67b6e9a0c90accfb0fdf46e4f627d3e941c0e9d4817c5aa5924be12b3a15ed5fc8ac82c242e3247d98e51d36961b5945d3620e3caee1476ad3b536fc245213599e320cc8b452848c1779c2a49230a3f25d217a340051b5f07de3eb27ea0d4e7f84037983d397f044bdc1d90b68686f70de83c323119c6bafbdb5f10bce4f9f70b9ebce40d0efab43ed733a9022408b0304472d7d75a43803a998590b9bcbc3adfb6c3aa582465db352d5d1175ad19a858b78a21ff1a95dc1a53bc7365d8ba672df679b1d44644f3d5e885f5b42cb486db57adf6d41bf974798cdd78d99c649d282d6bff57ae180fed8aaead3ad5d80815cb580f9abee799e73adc2ebeef99ecabb6c4c12335a342695827fa3aaae972f5faa8ae67baf1f1455f5755d454d3ab8ce83ab410ba493aa836b5cb542d7fe4ef5ce2ca8262691aa72519a0ec1daf95e39df8fa47ad065f91cb716a114f10ab53ad34e0bbc9efa67be5b9d4cff4d3b2ddc1a32db309993cb1650bcdb0d25a1d6d9fc3dd914d73b9a769bc9888e8be7889a41b4a90ab0ba12f8d0db5bf97e5018d5ed5d6c7c26e74391f329edb3b7ac825dd76bb160f302cc1175b8047a078510a31abdbf9bd468734628a484c1a322f1aeb42508c165e3dc6cc5d5badc0ce5ebdf7efacc63753cd18abe19956f6f3f2245a0f7217c8316c5e6a82fe03d50a178203ce4fae90eeeaf89006eae2d1e0406058cb8bfea86fe0a1fc77ea83322eeafbba1bf563111c43eed10eeaf20f6a7ea636defec95d819fba1839fb11f69dc54f9cceff41096667867f9a2ef1b1bdd39e1af4cf7b4afc1fd0e96a3e70e8bb9b2e814f9d1b41e97acb61a085532b6ac3f75d3ba2ab1ab52217426c83c37b64cd628c6c32909fd103212fa0a23427f6aaf6a96231556462ab42315da910aed48956605f5019b288650db54c0d4b27e5fabe3873753eb7db2a41f7d5ba3673f9eac8296559805a34eff35bfceeee621b1c2fca63b5cda645ae2064359aaafebd0763b3785cd8bda15afb139085108501ef24721731a21fcfc690a22edd39c84426eba2580991bc9d626549fff5ff72e58fe340c9d72a14f788a70a752370207acd23d8141143dd8a32ee6e4692b1cea47456b3d82c24eca5e4283fce5b9a61e26cff4d07ad79a383d3cd8d83d8a698fc9dfd1d849d15847d25bc1b15cf2e9c5cc9be0788a2675d1352d246d6a73192eb46567de197f050b6ddc5944ac6189182cc00881f02eafdabc8f77a8ea48551d1dae5adb33adab554f055ff82b5857ebd7b16b585561a55af5ab2aa4e4fe1ae688c11ad4b15c1bb4ed2a8786aa97bb272da5da6d242f28923810441de974395f1f66071ce5c9d2482ede7b69a23c0038578b2bcc7f7122089fe5dfbf8bd1dee3718b8a83d381626c9ff58b40c90451d85016de27f44d42f525f7e0a8074b45dcc4037d27c2c798cdde687e3638ea1b55e65b9ef05a48df610a3622e8c32ce8c37dd08730e8efac49ace16c234860090f308719e9597f85a33ef4ecff8d5f635891d1181ed59f7bc5085fa93fd72456077312225cb9db53da0ca2bd6b38362545a7bdfed98f2f7f7cf1e30fb87265056faeed9b29e56eb6c670d31059b9878237dfd18dcaa510bc61edb6a20011b1c2b25203ceecb9d8d877f4b1becb62f8f87d2063f4a1a0f44bbd0f317d54d888549d112418aedbedbc535fe3df298a4e06909c0c30dcb4db374d0978071f9e63ab87f269c736a83509d943983b4bb8d5dcef61d6f62ae77e0f33c8f77f8afbfdf6a7b9dfcfffa5dc6fc94b57f853fe0799e1c5eb9e9a4d91eb09672a7c53847770af359f31fb76cbdf0bcee4becdaa5a86e45ab14f1ac0bc1b8bf0f0dad7796d3e443188d76a0fb2d793e30824791c8931a83fe471c4cc977e8a13549048fda32218fe0eae7d3dea0fc664704c4fa26e1fd6a3fee998f4bb83637692c0afa899112944cd8b4e0704f9ec98800a55b1daa1f5f38b706df1518b3a058647fd06265c15fbb668e4038a0a66ba826f072a30fc002bf9811b5b5dee106d65aabb77ab3b7414c9c7a24306c7eb516fac46e464ad6f7aaa41e9eae8f3b11a9813f56146678f6b2f9a3e3866fe4a0faa3003eaaf4f92c2f2b44b746520f4c7a9ae44d52d8f51bf4bb1a9b3434411ec8d8f0905dd024255ddf0c172a72aed100f6cabbb44e6edf63b8455d69ca32da94e7057636f0be7269b9d31e36bdc87b49f81c614a392271c5495975a975e63960591faf4c099a42b895a74b5a42256542b4cbafa8a490b620c4722f7ccd07acbb32432da1c16cb384ce2dfa9a7afa4f8de574a17a997c4dfa827e7d4b3169dda8b0cfb4be94426967e6b68fc9be4061d0915d23c45a6fb59dd81b505f8bd0abccfd80409ffeb97b77797d79fff7a09c2ff747375f7f1c3cdcf5fef8a580cc2968084ffe6faeae69d562a94bb73ee2bdb8d338e66841383325f40e6cf20f3ef21f3ad5b5ed73aa1e221d4e444c27ffbe9fad397bb373fbf7f7ff5e5eecd875bbcdb5dfb090f35477c60fb29d21b77218d690d047ade6ecffff099264ebfe68e63ea1e28e9f76e64c0882ebb449d6aa811914ae9e0e1238c26ea68d125fdfc2ab0a552437b18b041b8f6cbf7b111b3cf3d13e6c7fa0d7cf96aa137b51e2164b1dd2e0821d26e66f64ed2e368311e5a4268a8d9eef059456f2d68e6b4eabeda2a1b841bbf7ca8bba955b3a255b3ed76b6dfaad568361eaedc56e922f5766a0f14314d1103519e490e1f871ca99ed19ecedcfb35ab111b0fa9bf22d23d08517fed46ac61d96e2f915407f19b225a870f1f8ae2293ad24b852f62e33ae64b2ef7c5cd8d2bbfcdcb458bf2e5223555720c9ce8cd469f8c86cc5f691910f3d7a4cbb5e4c5a44a0ed4a6d13ceda1dd7e50c76ad585ebb20b26e6bfe0a834b747a5dc6c42f09908177bcf598a769be21b424bff86564f7e53578c5b3be8f4315c7ae93c8ca8f038d304759aac7ddff77ea1d26fe90ab565ca53155eff575658c865de6a13eb5baec7ed2de7228a592869b377747fa5181bbb0bab5951fb3055fbb09e2bedbd5aefbbd86cf40a44bbafd6bb2f36dbbc82a4feea5891447dd98e507f7d8cba9a3a52a769ba49b7dcb4f03b9aa61a5629f4242fd4d6a8dad4316c425ead6a51c7300c790f3a7d7caca8b56e7cbf4bfd353e4e54b8e0e42fa569d3679ed6ef8936fa3f2efcbaeaabb2c6fff573e3af38b4f2ed42b590667a21c553c490222baabdaa8dc5aba62ad218ba38b5ed9cf7f86f31dc1ebcab6acee3e54dd48aca2ddebfd0eaa06bf54eb603e3aca1aaf6cf81f9fa5b160a5a55fe55aba18edaaf2e6e98ec5ff4aac8171afb139c19cd5b4335c18b414392dbd1e0c5691da2d6cde0c5591da2ec64f0e2a94733dd27e5cebff36648bf77d63f3b3d3d6ff6d4aa08473c4567daaea7f0b64009cdb722748246fff96f637c3283d6ffe8ff8f7e0b6378e9406346b4b3bb0feaf0947bc9ec63e8bf30c6430ae57f3872e03561fa8be6ba4a27de31f3e674e529840fa5f718cbb9b7147442154be8b5feade57b57feccf7feadd79b4e7b3ddffb894bcf386af3fed2a1c3c36d78f5eac7ede0fc5cfb0fd977026f0e790eb3b27f37e1d9fb2de60538cd2c7d374b65f248fb16b989aeb0548328878ad377b1906b72d40717d8884edc182b28a10d7d78e686cbbebfbcdc2ba3d559e87d02496c0e2666db306e748d9512cd1de35a4881e148b38826fc3914e1824a9500d47ffbe9e3e70fd757775f6f2f6f7ffe8a739d8b03ff814df9359f21819b4e0e1c03cfcd6e857bd342960a9cbce576d519dd96e264fcbf5d7db9bdfac7ddd7bf5ebebbfaa2352aba51efbf5cfef4f1eae6364f303d0da50c2773db29ae0e477b71a18a4b4a12a09a67fa6e23cace2b7ee5fac3cdff51ed79d6d473ded8f30c4396f79cbbe6e1764ee329d20ee38fe56b5a718d23f455fcf7090fe5e9e05288705dbc857a2c8f07ce513fa54604b22b2e6516d584f655ddc2f1f866079cf486fc952c6f7417a75839e2630849b76f2c14b5bfa3516fdc6eb7eecc777fac1b1c9aee1bbfa8d77c623ca03135d62121a4dbdf775e6a07b6386acec3075abc0eee156e5b03afd589f1508c623fd52f510ff09884bb9c26b5b2d69169d376dbba33dffd71c33bddea0cacaa99c6b34c508f67d25bf34c78b1f683ed7b9749e2652c56a42bf5d2b93e326b832543c6fe92ddfd45d1b269bc022f644e03530b10defda5a511ce8ec5cfa6b0ea60a8bd9a1012fed1e1b02d3b3018e53ab236619565134830976f35ca0402267cb9d6df9f4321030e8a8b2cc3b156e3db56a741081343cd025abfdc61ee8ee59864904868eca123d6d12f2bc80e1fefb9d43d94cbe29cc93cac9401e687c40d37ffce9ff15fd970fd9a6a9eebcaa5cac606ffb15c03143f8ee8d80169bc0eb61ed1f1d09891da3bfa7aa9d843a64a057534868536073432ef1cb237cc0d4f8b141064821678b8440264eed9653dba1f2dc6a567170b5c9407f7a3fc734c14a8b92051bbf766733fd67cacda68d5d2ca836796cd5d37e8c61852d0962fb0e7655a10b90f8b70464190c5503fa5a5764f9ea69f443c8b1969858cb3f58267690ba4cf59c2c3c815c9a8864f91be68897720fd544c888b7769f906387df462343f9ee1e1a3f112ec5aed4fab6e09268a1af2dcae32a0bba1d0cee533418d838cd7e4b1609b52946bfb1f4735b0f13056fbbd1f89f051f7539debfd094f8e67207cc11f8f6730831986fb111d13a69a0feb91fe1deb67b70b6cea81da02dd770b4a33f613faea550f0461ff4ed531f964ae823111ff5e3c345d69542041f0c780c38427951b5811c29b2bb7ca15e9c103a9beed99a8116db7919dbdca75c3070c2b3587260f86d5eb7eef22423878c85924e776630467bd5ee5fa8e23d47d1cd1da485a7e0704791cb1bd34b902aead6ad5c8c68499b11d0a67e4a5e657543a2d471e38c466061a6a7446a2a1ce32559bb23dc0dc7938926eb7fddee00cab999891392c481fd66aeb54436a557b234308b85a22e6d87e1b2734f5965478b6ae7c63b9a7de923faa43fbd4938fdc6f6984bb221bdb88423369420c8c8cca38f5b83565a58100cd6b9607e610d47a0ab2e2307855bb4eeab81246b44dbb7dec3ab3b78ddcbb4f676ed339a9c1f90b45779fbd5c5cdc5dbeb399831edcd935d88334fe9d068d2f3a9d0e201593803510fb17cfbe14e5107b6b0dc842193f50e3b5a7dd5ef88638db6144d5f45c00b8b0ac670e85870bdf186ee7318b51ebf6ea1fb73f7fb96a75d818c342df8529527d9b7837780752a54abad2883b78574decc1c2fff2d39bcbf2e7e79baf1f7ebab97a77f7e697db2ba076a5d8320a4634ae1653063e5efe74f7fec3f5edd51758284ef5eaf2cbf7e7fd7053cf7bf7f1c3e78f979fefd4f7d5d75b55d48c322a42493fc6cb45b8ac94a5922db3d28fd1e3a895868b6542851a2373c670479bc8ea35ee788ae6f942b4841e2499fb0ed623232f31dbb574b7eb23e9ecd7edb60eb9956db70ca948a07838f7cbe585dc6b4d42d1e10561b022196218e6d6fd15c53023abda79e457f8acfb9b16318af09095ef72506806a35678f740859a019eb6a015de9927b18a6704546476974e04a5ecabbe00d1caee1c9b2a9568c6b1e706fa6e60e0064e4d098afe7ca6c28e5d6beccece143dfa3500a00ac0e861fea6db6b5a68ce1a8f7ed187a7c1ea9dc3b02ed693d172b9f779d2aaf7f3383afe36bc1b49b57daebad4575402ee46b2d31f932ed34f1d17518331393ba6be25293aea54e7eb384067fbf9ce2bf93a7d1df962afc61f4c4eb7b01fab39073af2e57e5b7bfb59fbfda6bcfdc15e83fba7fb2dee9f3535b97fbe9ff94543cd3f54339fd65e58ba232bdf3921a03bb8846f182ef367a899598115a9a56269f0905d14a516dc6880cab81ecc8d9a4cc34341b83559ae67dce10a3f44f1e6522b712ebba4af08471cbdba6cb74d9c2eafdd9e5be58d6d0facfccad906dd814128b83cfe06df70f579268575ac6845d19edaa34a378a5db826748fb1b92714ae080305e05e45c69b3a45303b83c5fc857ff9e5cbe52f56d9086b9dac93de8532ac27dfc1c27ff7cbcde5c70f6fefde7db9fcbb367b4137eac052ac6463887a367d500b3aa71970d4876b67b90fd4722f090cdcc31556c90fcefad546b254b80b1d06b0f0df5f7fbabc55059e1ebbc2075f6d4f5fef3e5f7db9bbbabefa7875730bbdc345d68902f4ff50c93f62904895ae18400d94aa7de7cb87cb9b9faeafbe420f5e1c5f1a6e660e335868e3ba47d54db8861bf846fa3fc267c211865fb5e595f6c8ad5d245e921edced4b565e9c1537ac34532520d743052994d612c1144afd6130813dcd5f1041cdfa2a485c0382a555c9050f357f2ed65f4f6b29e8244ef5ed6f1ac5d962e94d553b872d683d84621db399f7402767de84275cd4624fbd074bdaf5e255a9161fbc7cd778e7957bcb33e9fd67d207cfa49fead6f138f21661ccf47b78d8dbb4a0e5795e3cf550a5adfeef1e215ecf2f203c6f96dcbd17e1ccc89c49ce530fdea1b20750edb0bf5ae3a1c9bef3ac52adb19efe1faba7ff67eb19fcb17a067fb69ed33f56cfe9b3f56ceaa5289c438549781f0fbd5d0b5abbd6d8ff95c70cb5fec95a15ff1e254217923355c6c0735823556599aad1dcdbe7955c2cd325b89c939bb808e599e7f0516e9a297c8f457a7efd1cc0df597297dfbef7885ba9776c86cae9e689dbe07cf85ad0326d9a70c1a81ae1058fd07eefc13bf31d68d5fe0f2ca22b9bc1bcf3ba9fcd3b51f960bfc7b5b254ca17fee8114f9f7b9f03573df0d4f23971325741def2245b30dbbca2b9e0d6562bd4d46f5faccd339cd4e1b56b4433548a4ef4f2a9a823b2c1d5012a86b958394efefef3f9fb4fe51f7c57fd3d37ffb3b5596885732e90774c8aa11fd613fd95d721eeb01f3f01bbce61d5803f05f87b311d4fa3d74933bad48882e3c4476b4d2f651256ae8d9ae8036288222d38d74fa8578b08ce7fdc8de1c533ee946b12e1554d24a6c5bb2b97e513cf59967cce459070597b31f7a95cdf9a7285cfe5ba69ca953d97ebba2957fa5caeaba65cd3e772dd37e59a3c97ebb12957e468c5b4fd9a3ad5949acd9c27034e4c52a9035b75f92bd66eb357c25f7578bb2dfc7597bf92edb67c25fc7527573ebacc7b52be22e6156e3f1c2b10c420aa4a38fffc4b40ce89c131c7b68ffa148973e7700c424b3e8c9548e1554376481fc75324081dc9b11f2e97c9da3e350c0ce3fd4ece9cf7971d1b2ef34805e9434cca07d5c38a21fd1cddc048021d6360dad4a67ce0635d3ee5b383cc95e8ef3f4310ee3f43a0eff155ef23e8f17fc3336d4e6a66c0783ada0d0fb9142bbc47a41852d4fc2e84d38ebaf5d50a6f44a7f3ef3f1042d41153952072f3410e3139ea0f2bddeeaef553f7d5de77d7bee44be024d12fe0b4dbf288107e8164bb3d47f73092630c92a8e2e2ed768e1e750c0eac5e30876fb7910528b218097cdc6e2fb52fe4277a67de89a85bce0bd38314d526efa95e0832d2dda06310a3def802c5648eae4034bcc114eebdc19461583cf3fcd2d38f1b3d802442bf2862b133effc137d5715eff79c9728fddd533834db94ee7f4642fd90a920a370bb95f978945a93033d5800efc6afce7abd763bbb98a3cf20703047dfd400c684c31c5d83c0a65378878d1d75fd9180c263f35e8a6ea13ee89ae129d41070a5fe5cab3f37eacf37f5e7b3faf3ab5956aef124c2c319fad560f925d9e851bc5267f660023a704dc30775cc2ddeab0852b04f47041914cf3b04214c9278f22d8821ba4fdeea4f01ee5315dab7e6dee3120173dcb6d7bb482ee172f75d4f8934bcb7fbc49b1f8a4778d66977ae4bd757c5b85e75ce9b7eda52491f860e302a5580e0fc5c55fa9ca30623f2aeb8aab5cffcbd80840c8ed1e0194149e7e7981d4ec5b0247f46a270f0cce39e080bf02abf070fe4fbcf7cbadef0ae28ea4f9ff3fe6847fef4e1cd57e70abf971f972776306c1ffcf07ed6342673d28399163ae999b2b2c1fe8be34451cd3d61d40cc35ac73ab3ab225735cf0f68dee9e3e3e4f5ccbf5f4b7aedd80ed1bdca06c71528600dd6457ae3a9554bf1506a03a3b56e2aac898419a18505aa119715ed0af186911084790c941251d3a13cc052ed488ec4543f1927aa3a14daa4435103fcb4e244732a871415b1abcf780a4c57a487a2aec4286582f5559d33a871049c88e368b818712dac87c58877faea730deb11ef0cc6849a1a74cae998480b74a63e0dd07901b483f26258c5407a8530cc3ba40fa1ae7507e5658b0adc5ccbcfe7a54c7ddefeffa83b831d3761200cdffb14cd1e10a65304c9de56ee6d0f95508ad4dea21c28260b6263455936218df2ee950788c70636d9b4aad4cb6ac1662e197d1eff33633bf86e6b69e787463b17907b4285bd3d19935a4df9248015cf8cde28b366ba3be622c57b30fb0740d93e20a96a2e4d59bcc261ad9a5bc34f202dd53c751c37e59350799aad9a17a66abe627ad274e51654357f8517a6868724eec250cde5fb54f331938d63dc83b492c293e02ac95c52b95c6242f73b0430f5720609cf3f876dcbe550bb65d2f64f6e7da33ecc5d777e91a05f40820e952887c2ca79d29739d051979c8c55f4da9dbe5a3b2fdd1a707ec85a18c60a86fb2f3cba8a86d19fd1b06430e7124a5e61b6e844cb10d851f00c7678e707a47c6721f0117e3210d4fd53061f367c673230bd998162146e1bcac0b7a6b50c7ce66234915bd989dc87f9a2f2ea867af86f97c36d9f107d98a52cf179a62967466258b2b3a6824c7b5e74ce33b58cc2c1d851a38212a35bc69a73b1e3e0bb9dc5b9b2f1e71a62af869a5149851d339741fc898766051a9542d8d1fee504059730c9f48cc31a5cd67004c202d7c1715cac4f147d706d4c70ad999e345db91b0aae1c9e981a1ea20cf1019881d0e0aaaf00d798c90e5ca20fae8b66c3a9b24bc825fcf8dbd7f90f85aeb8d10f537a144393ede3f7b0e797a0f87678ac764fff3a3a7eb4a3e3d9ff1c1dfbf5612cbbd1592a64d5660de877bf3e7ad4f422582e82e5fb62ea68289ede23966d94470cca1eca2306f1f99af4268a953ac0ab7af1cf96c63a054d03273441fc3a90137e39c73f37af8617da8648f1dd789d5d1840b7bb957f63773bd064a33fbc0bfc30f0c33bace3537f60112e991bb2137bf81d0000ffffce0c5d9bfc000100", }) if err != nil { panic(err) @@ -27,12 +27,11 @@ var _ = func() error { func() { b := packr.New("Assets", "./static") - b.SetResolver("css/normalize.css", packr.Pointer{ForwardBox: gk, ForwardPath: "f3aa7c7c063ea75f55c6f07e3b99f877"}) - b.SetResolver("img/gos.png", packr.Pointer{ForwardBox: gk, ForwardPath: "166310f2d73113b478111b0a976a0eea"}) - b.SetResolver("index.html", packr.Pointer{ForwardBox: gk, ForwardPath: "2f53e054245e3cec681be9135541dbcb"}) - b.SetResolver("js/main.js", packr.Pointer{ForwardBox: gk, ForwardPath: "f256e6f5a46e10e60db6a2444386dc4e"}) - b.SetResolver("js/vivagraph-0.12.0.min.js", packr.Pointer{ForwardBox: gk, ForwardPath: "853579e9f8c28c5a0ea8a5ed642bbad0"}) - }() - + b.SetResolver("css/normalize.css", packr.Pointer{ForwardBox: gk, ForwardPath: "6efea0b1a321e915a08e349981e5ecb4"}) + b.SetResolver("img/gos.png", packr.Pointer{ForwardBox: gk, ForwardPath: "1251d44231d5c73843ec32f152a99720"}) + b.SetResolver("index.html", packr.Pointer{ForwardBox: gk, ForwardPath: "365b40bdd0eaf3ff91befa9cf678cff5"}) + b.SetResolver("js/main.js", packr.Pointer{ForwardBox: gk, ForwardPath: "653d997454aa41f83d7201bb5a44c823"}) + b.SetResolver("js/vivagraph-0.12.0.min.js", packr.Pointer{ForwardBox: gk, ForwardPath: "8dc98ea9b53fc120222481e941803c10"}) + }() return nil }() diff --git a/plugins/analysis/webinterface/httpserver/static/js/main.js b/plugins/analysis/webinterface/httpserver/static/js/main.js index 8ede0c5a..96ceda51 100644 --- a/plugins/analysis/webinterface/httpserver/static/js/main.js +++ b/plugins/analysis/webinterface/httpserver/static/js/main.js @@ -1,4 +1,4 @@ -const ANALYSIS_SERVER_URL = "116.202.49.178" + "/datastream"; +const ANALYSIS_SERVER_URL = window.location.host + "/datastream"; const NODE_ID_LENGTH = 64; // for some strange reason color formats for edges and nodes need to be different... careful! diff --git a/plugins/webapi/getMessageByHash/plugin.go b/plugins/webapi/getMessageByHash/plugin.go new file mode 100644 index 00000000..7672a066 --- /dev/null +++ b/plugins/webapi/getMessageByHash/plugin.go @@ -0,0 +1,86 @@ +package getMessageByHash + +import ( + "net/http" + + "github.com/iotaledger/goshimmer/packages/binary/messagelayer/message" + "github.com/iotaledger/goshimmer/plugins/messagelayer" + "github.com/labstack/echo" + + "github.com/iotaledger/goshimmer/plugins/webapi" + + "github.com/iotaledger/hive.go/logger" + "github.com/iotaledger/hive.go/node" +) + +var PLUGIN = node.NewPlugin("WebAPI getMessageByHash Endpoint", node.Enabled, configure) +var log *logger.Logger + +func configure(plugin *node.Plugin) { + log = logger.NewLogger("API-getMessageByHash") + webapi.Server.POST("getMessageByHash", getMessageByHash) +} + +// getMessageByHash returns the array of messages for the +// given message hashes (in the same order as the parameters). +// If a node doesn't have the message for a given message hash in its ledger, +// the value at the index of that message hash is empty. +func getMessageByHash(c echo.Context) error { + var request Request + if err := c.Bind(&request); err != nil { + log.Info(err.Error()) + return c.JSON(http.StatusBadRequest, Response{Error: err.Error()}) + } + + var result []Message + for _, hash := range request.Hashes { + log.Info("Received:", hash) + + msgId, err := message.NewId(hash) + if err != nil { + log.Info(err) + continue + } + + msgObject := messagelayer.Tangle.Message(msgId) + if !msgObject.Exists() { + continue + } + + msg := msgObject.Unwrap() + msgResp := Message{ + MessageId: msg.Id().String(), + TrunkTransactionId: msg.TrunkId().String(), + BranchTransactionId: msg.BranchId().String(), + IssuerPublicKey: msg.IssuerPublicKey().String(), + IssuingTime: msg.IssuingTime().String(), + SequenceNumber: msg.SequenceNumber(), + Payload: msg.Payload().String(), + Signature: msg.Signature().String(), + } + result = append(result, msgResp) + msgObject.Release() + } + + return c.JSON(http.StatusOK, Response{Messages: result}) +} + +type Response struct { + Messages []Message `json:"messages,omitempty"` + Error string `json:"error,omitempty"` +} + +type Request struct { + Hashes []string `json:"hashes"` +} + +type Message struct { + MessageId string `json:"messageId,omitempty"` + TrunkTransactionId string `json:"trunkTransactionId,omitempty"` + BranchTransactionId string `json:"branchTransactionId,omitempty"` + IssuerPublicKey string `json:"issuerPublicKey,omitempty"` + IssuingTime string `json:"issuingTime,omitempty"` + SequenceNumber uint64 `json:"sequenceNumber,omitempty"` + Payload string `json:"payload,omitempty"` + Signature string `json:"signature,omitempty"` +} diff --git a/tools/integration-tests/README.md b/tools/integration-tests/README.md new file mode 100644 index 00000000..156b5d2b --- /dev/null +++ b/tools/integration-tests/README.md @@ -0,0 +1,53 @@ +# Integration tests with Docker + + + +Running the integration tests spins up a GoShimmer network within Docker as schematically shown in the figure above. +`N` defines the number of `peer_replicas` and can be specified when running the network. +The peers can communicate freely within the Docker network and this is exactly how the tests are run using the `tester` container. +Test can be written in regular Go style while the framework provides convenience functions to access a specific peer's web API or logs. + +The autopeering network visualizer, `master_peer's` dashboard and web API are reachable from the host system on the respective ports. + +The different containers (`entry_node`, `peer_master`, `peer_replica`) load separate config files that can be modified as necessary, respectively. + +## How to run +Prerequisites: +- Docker +- Docker compose + +``` +# Mac & Linux +./runTests.sh +``` +The tests produce `*.log` files for every peer in the `logs` folder after every run. + +Currently, the integration tests are configured to run on every push to GitHub with `peer_replica=5`. +The logs of every peer are stored as artifacts and can be downloaded for closer inspection once the job finishes. + +## Creating tests +Tests can be written in regular Go style. Each tested component should reside in its own test file in `tester/tests`. +`main_test` with its `TestMain` function is executed before any test in the package and initializes the integration test framework. + + +## Use as development tool +Using a standalone throwaway Docker network can be really helpful as a development tool as well. + +Reachable from the host system +- visualizer: http://localhost:9000 +- `master_peer's` dashboard: http: http://localhost:8081 +- `master_peer's` web API: http: http://localhost:8080 + +It is therefore possible to send messages to the local network via the `master_peer` and observe log messages either +via `docker logs --follow CONTAINER` or by starting the Docker network without the `-d` option, as follows. + +``` +docker-compose -f docker-compose.yml up --scale peer_replica=5 + +# 1. test manually with master_peer + +# 2. or run in separate terminal window +docker-compose -f tester/docker-compose.yml up --exit-code-from tester +``` +Sometimes when changing files, either in the tests or in GoShimmer, Docker does not detect the changes on a rebuild. +Then the option `--build` needs to be used with `docker-compose`. \ No newline at end of file diff --git a/tools/integration-tests/config.docker.json b/tools/integration-tests/config.docker.json new file mode 100644 index 00000000..08ffcb36 --- /dev/null +++ b/tools/integration-tests/config.docker.json @@ -0,0 +1,73 @@ +{ + "analysis": { + "client": { + "serverAddress": "entry_node:1888" + }, + "server": { + "port": 0 + }, + "httpServer": { + "bindAddress": "0.0.0.0:9000", + "dev": false + } + }, + "autopeering": { + "entryNodes": [ + "X2cmCzYnZDjmsvdAH90Q7oKmhNeTdwJdj2FX84adLzo=@entry_node:14626" + ], + "port": 14626, + "version": 1 + }, + "dashboard": { + "bindAddress": "0.0.0.0:8081", + "dev": false, + "basic_auth": { + "enabled": false, + "username": "goshimmer", + "password": "goshimmer" + } + }, + "database": { + "directory": "mainnetdb" + }, + "gossip": { + "port": 14666 + }, + "graph": { + "bindAddress": "127.0.0.1:8082", + "domain": "", + "networkName": "GoShimmer", + "socketIOPath": "socket.io-client/dist/socket.io.js", + "webrootPath": "IOTAtangle/webroot" + }, + "logger": { + "level": "info", + "disableCaller": false, + "disableStacktrace": false, + "encoding": "console", + "outputPaths": [ + "stdout", + "goshimmer.log" + ], + "disableEvents": true, + "remotelog": { + "serverAddress": "remotelog.goshimmer.iota.cafe:5213" + } + }, + "network": { + "bindAddress": "0.0.0.0", + "externalAddress": "auto" + }, + "node": { + "disablePlugins": "portcheck", + "enablePlugins": [] + }, + "webapi": { + "auth": { + "password": "goshimmer", + "privateKey": "", + "username": "goshimmer" + }, + "bindAddress": "0.0.0.0:8080" + } +} \ No newline at end of file diff --git a/tools/integration-tests/docker-compose.yml b/tools/integration-tests/docker-compose.yml new file mode 100644 index 00000000..068a95ba --- /dev/null +++ b/tools/integration-tests/docker-compose.yml @@ -0,0 +1,51 @@ +version: "3.5" + +services: + entry_node: + command: --autopeering.seed=uuDCzsjyLNQ17/7fWKPNMYmr4IWuaVRf7qKqRL0v/6c= --autopeering.entryNodes= --analysis.server.port=1888 --node.disablePlugins=gossip,portcheck,spa,webapi,webapibroadcastdataendpoint,webapifindtransactionhashesendpoint,webapigetneighborsendpoint,webapigettransactionobjectsbyhashendpoint,webapigettransactiontrytesbyhashendpoint + container_name: entry_node + image: iotaledger/goshimmer + build: + context: ../.. + volumes: + - ./config.docker.json:/config.json:ro + ports: + - "9000:9000/tcp" # visualizer + expose: + - "1888/tcp" # analysis server (within Docker network) + networks: + - integration-test + + peer_master: + container_name: peer_master + image: iotaledger/goshimmer + build: + context: ../.. + volumes: + - ./config.docker.json:/config.json:ro + ports: + - "8080:8080/tcp" # web API + - "8081:8081/tcp" # dashboard + depends_on: + - entry_node + networks: + - integration-test + + peer_replica: + command: --node.disablePlugins=spa + image: iotaledger/goshimmer + build: + context: ../.. + volumes: + - ./config.docker.json:/config.json:ro + expose: + - "8080/tcp" # web API (within Docker network) + depends_on: + - entry_node + networks: + - integration-test + +networks: + integration-test: + driver: bridge + name: integration-test diff --git a/tools/integration-tests/logs/.gitkeep b/tools/integration-tests/logs/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/tools/integration-tests/runTests.sh b/tools/integration-tests/runTests.sh new file mode 100755 index 00000000..eb2e4de6 --- /dev/null +++ b/tools/integration-tests/runTests.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +if [ -z "$1" ]; then + echo "Usage: `basename $0` number_of_peer_replicas" + exit 0 +fi + +REPLICAS=$1 + +echo "Build GoShimmer Docker network" +docker-compose -f docker-compose.yml up -d --scale peer_replica=$REPLICAS --build +if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi + +echo "Dispay containers" +docker ps -a + +echo "Run integration tests" +docker-compose -f tester/docker-compose.yml up --abort-on-container-exit --exit-code-from tester --build + +echo "Create logs from containers in network" +docker-compose -f docker-compose.yml stop +docker logs tester > logs/tester.log +docker logs entry_node > logs/entry_node.log +docker logs peer_master > logs/peer_master.log +for (( c=1; c<=$REPLICAS; c++ )) +do +docker logs integration-tests_peer_replica_$c > logs/peer_replica_$c.log +done + +echo "Clean up" +docker-compose -f tester/docker-compose.yml down +docker-compose -f docker-compose.yml down diff --git a/tools/integration-tests/tester/docker-compose.yml b/tools/integration-tests/tester/docker-compose.yml new file mode 100644 index 00000000..dda307f0 --- /dev/null +++ b/tools/integration-tests/tester/docker-compose.yml @@ -0,0 +1,17 @@ +version: "3.5" + +services: + tester: + container_name: tester + image: golang:1.14 + working_dir: /go/src/github.com/iotaledger/goshimmer/tools/integration-tests/tester + entrypoint: go test ./tests -v -mod=readonly + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ../../..:/go/src/github.com/iotaledger/goshimmer:ro + networks: + - integration-test + +networks: + integration-test: + external: true diff --git a/tools/integration-tests/tester/framework/framework.go b/tools/integration-tests/tester/framework/framework.go new file mode 100644 index 00000000..58aba94d --- /dev/null +++ b/tools/integration-tests/tester/framework/framework.go @@ -0,0 +1,99 @@ +// Package framework provides integration test functionality for GoShimmer with a Docker network. +// It effectively abstracts away all complexity with discovering peers, +// waiting for them to autopeer and offers easy access to the peers' web API +// and logs via Docker. +package framework + +import ( + "fmt" + "math/rand" + "time" + + "github.com/docker/docker/client" +) + +// Framework is a wrapper encapsulating all peers +type Framework struct { + peers []*Peer + dockerCli *client.Client +} + +// New creates a new instance of Framework, gets all available peers within the Docker network and +// waits for them to autopeer. +// Panics if no peer is found. +func New() *Framework { + fmt.Printf("Finding available peers...\n") + + cli, err := client.NewClient( + "unix:///var/run/docker.sock", + "", + nil, + nil, + ) + if err != nil { + fmt.Println("Could not create docker CLI client.") + panic(err) + } + + f := &Framework{ + dockerCli: cli, + peers: getAvailablePeers(cli), + } + + if len(f.peers) == 0 { + panic("Could not find any peers in Docker network.") + } + fmt.Printf("Finding available peers... done. Peers: %v\n", f.peers) + + fmt.Printf("Waiting for autopeering...\n") + f.waitForAutopeering() + fmt.Printf("Waiting for autopeering... done\n") + + return f +} + +// waitForAutopeering waits until all peers have reached a minimum amount of neighbors. +// Panics if this minimum is not reached after autopeeringMaxTries. +func (f *Framework) waitForAutopeering() { + maxTries := autopeeringMaxTries + for maxTries > 0 { + + for _, p := range f.peers { + if resp, err := p.GetNeighbors(false); err != nil { + fmt.Printf("request error: %v\n", err) + } else { + p.SetNeighbors(resp.Chosen, resp.Accepted) + } + } + + // verify neighbor requirement + min := 100 + total := 0 + for _, p := range f.peers { + neighbors := p.TotalNeighbors() + if neighbors < min { + min = neighbors + } + total += neighbors + } + if min >= autopeeringMinimumNeighbors { + fmt.Printf("Neighbors: min=%d avg=%.2f\n", min, float64(total)/float64(len(f.peers))) + return + } + + fmt.Println("Not done yet. Try again in 5 seconds...") + time.Sleep(5 * time.Second) + maxTries-- + } + panic("Peering not successful.") +} + +// Peers returns all available peers. +func (f *Framework) Peers() []*Peer { + return f.peers +} + +// RandomPeer returns a random peer out of the list of peers. +func (f *Framework) RandomPeer() *Peer { + return f.peers[rand.Intn(len(f.peers))] +} diff --git a/tools/integration-tests/tester/framework/parameters.go b/tools/integration-tests/tester/framework/parameters.go new file mode 100644 index 00000000..a054aa30 --- /dev/null +++ b/tools/integration-tests/tester/framework/parameters.go @@ -0,0 +1,11 @@ +package framework + +const ( + hostnamePeerMaster = "peer_master" + hostnamePeerReplicaPrefix = "integration-tests_peer_replica_" + + autopeeringMaxTries = 50 + autopeeringMinimumNeighbors = 2 + + apiPort = "8080" +) diff --git a/tools/integration-tests/tester/framework/peer.go b/tools/integration-tests/tester/framework/peer.go new file mode 100644 index 00000000..4df0f64c --- /dev/null +++ b/tools/integration-tests/tester/framework/peer.go @@ -0,0 +1,102 @@ +package framework + +import ( + "context" + "fmt" + "io" + "net" + "net/http" + "time" + + "github.com/docker/docker/api/types" + dockerclient "github.com/docker/docker/client" + + "github.com/iotaledger/goshimmer/client" + "github.com/iotaledger/goshimmer/plugins/webapi/autopeering" +) + +// Peer represents a GoShimmer node inside the Docker network +type Peer struct { + name string + ip net.IP + *client.GoShimmerAPI + dockerCli *dockerclient.Client + chosen []autopeering.Neighbor + accepted []autopeering.Neighbor +} + +// NewPeer creates a new instance of Peer with the given information. +func NewPeer(name string, ip net.IP, dockerCli *dockerclient.Client) *Peer { + return &Peer{ + name: name, + ip: ip, + GoShimmerAPI: client.NewGoShimmerAPI(getWebApiBaseUrl(ip), http.Client{Timeout: 30 * time.Second}), + dockerCli: dockerCli, + } +} + +func (p *Peer) String() string { + return fmt.Sprintf("Peer:{%s, %s, %s, %d}", p.name, p.ip.String(), p.BaseUrl(), p.TotalNeighbors()) +} + +// TotalNeighbors returns the total number of neighbors the peer has. +func (p *Peer) TotalNeighbors() int { + return len(p.chosen) + len(p.accepted) +} + +// SetNeighbors sets the neighbors of the peer accordingly. +func (p *Peer) SetNeighbors(chosen, accepted []autopeering.Neighbor) { + p.chosen = make([]autopeering.Neighbor, len(chosen)) + copy(p.chosen, chosen) + + p.accepted = make([]autopeering.Neighbor, len(accepted)) + copy(p.accepted, accepted) +} + +// Logs returns the logs of the peer as io.ReadCloser. +// Logs are returned via Docker and contain every log entry since start of the container/GoShimmer node. +func (p *Peer) Logs() (io.ReadCloser, error) { + return p.dockerCli.ContainerLogs( + context.Background(), + p.name, + types.ContainerLogsOptions{ + ShowStdout: true, + ShowStderr: true, + Since: "", + Timestamps: false, + Follow: false, + Tail: "", + Details: false, + }) +} + +// getAvailablePeers gets all available peers in the Docker network. +// It uses the expected Docker hostnames and tries to resolve them. +// If that does not work it means the host is not available in the network +func getAvailablePeers(dockerCli *dockerclient.Client) (peers []*Peer) { + // get peer master + if addr, err := net.LookupIP(hostnamePeerMaster); err != nil { + fmt.Printf("Could not resolve %s\n", hostnamePeerMaster) + } else { + p := NewPeer(hostnamePeerMaster, addr[0], dockerCli) + peers = append(peers, p) + } + + // get peer replicas + for i := 1; ; i++ { + peerName := fmt.Sprintf("%s%d", hostnamePeerReplicaPrefix, i) + if addr, err := net.LookupIP(peerName); err != nil { + //fmt.Printf("Could not resolve %s\n", peerName) + break + } else { + p := NewPeer(peerName, addr[0], dockerCli) + peers = append(peers, p) + } + } + return +} + +// getWebApiBaseUrl returns the web API base url for the given IP. +func getWebApiBaseUrl(ip net.IP) string { + return fmt.Sprintf("http://%s:%s", ip.String(), apiPort) +} diff --git a/tools/integration-tests/tester/go.mod b/tools/integration-tests/tester/go.mod new file mode 100644 index 00000000..9f8a2f04 --- /dev/null +++ b/tools/integration-tests/tester/go.mod @@ -0,0 +1,16 @@ +module github.com/iotaledger/goshimmer/tools/integration-tests/tester + +go 1.14 + +require ( + github.com/Microsoft/go-winio v0.4.14 // indirect + github.com/docker/distribution v2.7.1+incompatible // indirect + github.com/docker/docker v1.13.1 + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.4.0 // indirect + github.com/iotaledger/goshimmer v0.1.3 + github.com/opencontainers/go-digest v1.0.0-rc1 // indirect + github.com/stretchr/testify v1.5.1 +) + +replace github.com/iotaledger/goshimmer => ../../.. diff --git a/tools/integration-tests/tester/go.sum b/tools/integration-tests/tester/go.sum new file mode 100644 index 00000000..d9500e03 --- /dev/null +++ b/tools/integration-tests/tester/go.sum @@ -0,0 +1,543 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.36.0/go.mod h1:RUoy9p/M4ge0HzT8L+SDZ8jg+Q6fth0CiBuhFJpSV40= +dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= +dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= +dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= +dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= +github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= +github.com/benbjohnson/clock v1.0.0 h1:78Jk/r6m4wCi6sndMpty7A//t4dw/RW5fV4ZgDVfX1w= +github.com/benbjohnson/clock v1.0.0/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/bbolt v1.3.3 h1:n6AiVyVRKQFNb6mJlwESEvvLoDyiTzXX7ORAUlkeBdY= +github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dchest/blake2b v1.0.0 h1:KK9LimVmE0MjRl9095XJmKqZ+iLxWATvlcpVFRtaw6s= +github.com/dchest/blake2b v1.0.0/go.mod h1:U034kXgbJpCle2wSk5ybGIVhOSHCVLMDqOzcPEA0F7s= +github.com/dgraph-io/badger v1.5.4 h1:gVTrpUTbbr/T24uvoCaqY2KSHfNLVGm0w+hbee2HMeg= +github.com/dgraph-io/badger v1.5.4/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= +github.com/dgraph-io/badger/v2 v2.0.1/go.mod h1:YoRSIp1LmAJ7zH7tZwRvjNMUYLxB4wl3ebYkaIruZ04= +github.com/dgraph-io/badger/v2 v2.0.2 h1:uBAA5oM9Gz9TrP01v9LxBGztE5rhtGeBxpF1IvxGGtw= +github.com/dgraph-io/badger/v2 v2.0.2/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= +github.com/dgraph-io/ristretto v0.0.0-20191025175511-c1f00be0418e/go.mod h1:edzKIzGvqUCMzhTVWbiTSe75zD9Xxq0GtSBtFmaUTZs= +github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3 h1:MQLRM35Pp0yAyBYksjbj1nZI/w6eyRY/mWoM1sFf4kU= +github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190323231341-8198c7b169ec/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v1.13.1 h1:IkZjBSIc8hBjLpqeAbeE5mca5mNgeatLHBy3GO78BWo= +github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/drand/bls12-381 v0.0.0-20200110233355-faca855b3a67 h1:+zwFBPeS6Tx0ShngG44wyJ8wBh8ENK9upPxN2fE58Uc= +github.com/drand/bls12-381 v0.0.0-20200110233355-faca855b3a67/go.mod h1:HRtP9ULniFcAfoXvSrD5Kebk1e3/g4cvtBfjlT80PuQ= +github.com/drand/drand v0.5.4 h1:DyCkE4YHy1klVtu0YgYiYtsryyzyc0x6Y78HM2C9Mws= +github.com/drand/drand v0.5.4/go.mod h1:n9JV/s1TIL/kx/4002pct7qjilbdzScQKVu05IfHf8c= +github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= +github.com/drand/kyber v1.0.1-0.20200128205555-52819dbafde7 h1:ItV7+85W8JU5bQd/DxjT9y5Khsetlrp9CErHvDtYlE4= +github.com/drand/kyber v1.0.1-0.20200128205555-52819dbafde7/go.mod h1:Rzu9PGFt3q8d7WWdrHmR8dktHucO0dSTWlMYrgqjSpA= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= +github.com/gobuffalo/logger v1.0.1/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= +github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= +github.com/gobuffalo/packr/v2 v2.7.1/go.mod h1:qYEvAazPaVxy7Y7KR0W8qYEE+RymX74kETFqjFoFlOc= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/open-location-code/go v0.0.0-20190903173953-119bc96a3a51/go.mod h1:eJfRN6aj+kR/rnua/rw9jAgYhqoMHldQkdTi+sePRKk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= +github.com/googollee/go-engine.io v1.4.1/go.mod h1:26oFqHsnuWIzNOM0T08x21eQOydBosKOCgK3tyhzPPI= +github.com/googollee/go-engine.io v1.4.3-0.20190924125625-798118fc0dd2/go.mod h1:iaugrHMOoal16IKAWvH6y6RrXXIzfOULxjNwvXBCV4o= +github.com/googollee/go-socket.io v1.4.3-0.20191204093753-683f8725b6d0/go.mod h1:yjlQxKcAZXZjpGwQVW/y1sgyL1ou+DdCpkswURDCRrU= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gordonklaus/ineffassign v0.0.0-20180909121442-1003c8bd00dc/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.1 h1:zCy2xE9ablevUOrUZc3Dl72Dt+ya2FNAvC2yLYMHzi4= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/iotaledger/hive.go v0.0.0-20200403132600-4c10556e08a0 h1:CyUsunZHlWuD1s9GVz+XqAIZVpRDxJBspb4DheJVknw= +github.com/iotaledger/hive.go v0.0.0-20200403132600-4c10556e08a0/go.mod h1:LYUD1U+BxF+OY6zCZ4xp38vzjp/QWbUdCw9iwmxkGnc= +github.com/iotaledger/iota.go v1.0.0-beta.9/go.mod h1:F6WBmYd98mVjAmmPVYhnxg8NNIWCjjH8VWT9qvv3Rc8= +github.com/iotaledger/iota.go v1.0.0-beta.14/go.mod h1:F6WBmYd98mVjAmmPVYhnxg8NNIWCjjH8VWT9qvv3Rc8= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3 h1:Iy7Ifq2ysilWU4QlCx/97OoI4xT1IV7i8byT/EyIT/M= +github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3/go.mod h1:BYpt4ufZiIGv2nXn4gMxnfKV306n3mWXgNu/d2TqdTU= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kilic/bls12-381 v0.0.0-20191103193557-038659eaa189/go.mod h1:INznczsRc7ASFbWFUI9GnIvpi9s2FhenKE+24rdTmBQ= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= +github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= +github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mr-tron/base58 v1.1.3 h1:v+sk57XuaCKGXpWtVBX8YJzO7hMGx4Aajh4TQbdEFdc= +github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy8ALwOebjekYExl9HTT9urdawqC95tA= +github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= +github.com/nikkolasg/slog v0.0.0-20170921200349-3c8d441d7a1e h1:07zdEcJ4Fble5uWsqKpjW19699kQWRLXP+RZh1a6ZRg= +github.com/nikkolasg/slog v0.0.0-20170921200349-3c8d441d7a1e/go.mod h1:79GLCU4P87rYvYYACbNwVyc1WmRvkwQbYnybpCmRXzg= +github.com/oasislabs/ed25519 v0.0.0-20200302143042-29f6767a7c3e h1:85L+lUTJHx4O7UP9y/65XV8iq7oaA2Uqe5WiUSB8XE4= +github.com/oasislabs/ed25519 v0.0.0-20200302143042-29f6767a7c3e/go.mod h1:xIpCyrK2ouGA4QBGbiNbkoONrvJ00u9P3QOkXSOAC0c= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/panjf2000/ants/v2 v2.2.2 h1:TWzusBjq/IflXhy+/S6u5wmMLCBdJnB9tPIx9Zmhvok= +github.com/panjf2000/ants/v2 v2.2.2/go.mod h1:1GFm8bV8nyCQvU5K4WvBCTG1/YBFOD2VzjffD8fV55A= +github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sasha-s/go-deadlock v0.2.0 h1:lMqc+fUb7RrFS3gQLtoQsJ7/6TV/pAIFvBsqX73DK8Y= +github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= +github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= +github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= +github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= +github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= +github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= +github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= +github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= +github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= +github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= +github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= +github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= +github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= +github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= +github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= +github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= +github.com/simia-tech/env v0.1.0/go.mod h1:eVRQ7W5NXXHifpPAcTJ3r5EmoGgMn++dXfSVbZv3Opo= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.5.0/go.mod h1:AkYRkVJF8TkSG/xet6PzXX+l39KhhXa2pdqVSxnTcn4= +github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= +github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= +github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= +go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= +go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= +go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg= +go.dedis.ch/kyber/v3 v3.0.12 h1:15d61EyBcBoFIS97kS2c/Vz4o3FR8ALnZ2ck9J/ebYM= +go.dedis.ch/kyber/v3 v3.0.12/go.mod h1:kXy7p3STAurkADD+/aZcsznZGKVHEqbtmdIzvPfrs1U= +go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= +go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= +go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= +go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.mongodb.org/mongo-driver v1.0.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.4.0 h1:f3WCSC2KzAcBXGATIxAB1E2XuCpNU255wNKZ505qi3E= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.14.0 h1:/pduUoebOeeJzTDFuoMgC6nRkiasr1sBCIEorly7m4o= +go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190214204934-8dcb7bc8c7fe/go.mod h1:E6PF97AdD6v0s+fPshSmumCW1S1Ne85RbPQxELkKa44= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114 h1:DnSr2mCsxyCE6ZgIkmcWUQY2R5cH/6wL7eIxEmQOMSE= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200330040139-fa3cc9eebcfe h1:sOd+hT8wBUrIFR5Q6uQb/rg50z8NjHk96kC4adwvxjw= +golang.org/x/tools v0.0.0-20200330040139-fa3cc9eebcfe/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190201180003-4b09977fb922/go.mod h1:L3J43x8/uS+qIUoksaLKe6OS3nUKxOKuIFz1sl2/jx4= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24 h1:wDju+RU97qa0FZT0QnZDg9Uc2dH0Ql513kFvHocz+WM= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.1 h1:C1QC6KzgSiLyBabDi87BbjaGreoRgGUF5nOyvfrAZ1k= +google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/h2non/gock.v1 v1.0.14/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= +gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/tools/integration-tests/tester/tests/dockerlogs_test.go b/tools/integration-tests/tester/tests/dockerlogs_test.go new file mode 100644 index 00000000..49189d96 --- /dev/null +++ b/tools/integration-tests/tester/tests/dockerlogs_test.go @@ -0,0 +1,23 @@ +package tests + +import ( + "bufio" + "regexp" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// TestDockerLogs simply verifies that a peer's log message contains "GoShimmer". +// Using the combination of logs and regular expressions can be useful to test a certain peer's behavior. +func TestDockerLogs(t *testing.T) { + r := regexp.MustCompile("GoShimmer") + + for _, p := range f.Peers() { + log, err := p.Logs() + require.NoError(t, err) + + assert.True(t, r.MatchReader(bufio.NewReader(log))) + } +} diff --git a/tools/integration-tests/tester/tests/main_test.go b/tools/integration-tests/tester/tests/main_test.go new file mode 100644 index 00000000..bc82c6c9 --- /dev/null +++ b/tools/integration-tests/tester/tests/main_test.go @@ -0,0 +1,24 @@ +// Package tests provides the possibility to write integration tests in regular Go style. +// The integration test framework is initialized before any test in the package runs and +// thus can readily be used to make requests to peers and read their logs. +// +// Each tested feature should reside in its own test file and define tests cases as necessary. +package tests + +import ( + "os" + "testing" + + "github.com/iotaledger/goshimmer/tools/integration-tests/tester/framework" +) + +var f *framework.Framework + +// TestMain gets called by the test utility and is executed before any other test in this package. +// It is therefore used to initialize the integration testing framework. +func TestMain(m *testing.M) { + f = framework.New() + + // call the tests + os.Exit(m.Run()) +} diff --git a/tools/integration-tests/tester/tests/relaymessage_test.go b/tools/integration-tests/tester/tests/relaymessage_test.go new file mode 100644 index 00000000..ad29b94a --- /dev/null +++ b/tools/integration-tests/tester/tests/relaymessage_test.go @@ -0,0 +1,51 @@ +package tests + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// TestRelayMessages checks whether messages are actually relayed/gossiped through the network +// by checking the messages' existence on all nodes after a cool down. +func TestRelayMessages(t *testing.T) { + numMessages := 100 + ids := make([]string, numMessages) + + data := []byte("Test") + + // create messages on random peers + for i := 0; i < numMessages; i++ { + id, err := f.RandomPeer().Data(data) + require.NoError(t, err) + + ids[i] = id + } + + // wait for messages to be gossiped + time.Sleep(5 * time.Second) + + // check for messages on every peer + for _, peer := range f.Peers() { + resp, err := peer.FindMessageById(ids) + require.NoError(t, err) + + // check for the count of messages + assert.Equal(t, numMessages, len(resp.Messages)) + + // check that all messages are present in response + outer: + for _, id := range ids { + for _, msg := range resp.Messages { + // if message found skip to next + if msg.Id == id { + continue outer + } + } + + t.Errorf("MessageId=%s not found in peer %s.", id, peer.String()) + } + } +} -- GitLab