The nfe-repeater is a microservice which will consume nfe_received api from Arquivei and store it on a relational database to reproduce its output as a proxy.
nfe-repeater uses the following technologies:
- go - Open source programming language that makes it easy to build simple, reliable, and efficient software
- gin - Gin is a web framework written in Go (Golang)
- gorm - ORM Library for Go
- docker - Framework to securely build and distrubute applications
- sqlite - The SQLite file format is stable, cross-platform, and backwards compatible and the developers pledge to keep it that way through at least the year 2050
Docker is required to install this application using the Dockerfile. To generate your image, run the command below on the root directory of this project:
docker build -t go-nfe-repeater .
If you plan to just run locally, you can build the application using:
go build
The dependencies of this project are provided with the go.mod and go.sum files. To download them, enable GO111MODULE and run the download command on the root directory of this project:
export GO111MODULE=on
go mod download
The database sqlite was choosen by its simplicity. Per default, the database will behave as an in-memory embedded database which will lose/delete all data when the application is stopped. This behavior can be changed by configuring the configuration.json file. Editing the line and providing a file path to your storage will enable file persistency:
"storage": "<storage_path>"
When the installation is complete, an image will be built and available to create a container on your machine. To bring it up, run the command below:
docker run -d -p 8080:8080 go-nfe-repeater:latest
Return the details of a given nfe based on the access key provided.
URL : /nfe
Method : GET
Parameters:
key
: String - query
Auth required : NO
Permissions required : None
Request example: http://localhost:8080/nfe?&key=35180104710149000115550010000084031000084036
Code : 200 OK
Content examples
For an valid access key, the output will be a json containing the access key and the xml encoded in base64
{
"access_key": "35180104710149000115550010000084031000084036",
"xml": "PG5mZVByb2MgdmVyc2FvPSIzLjEwIiB4bWxucz0iaHR0cDovL3d3dy5wb3J0YWxmaXNjYWwuaW5mLmJyL25mZSI+PE5GZSB4bWxucz0iaHR0cDovL3d3dy5wb3J0YWxmaXNjYWwuaW5mLmJyL25mZSI+PGluZk5GZSB2ZXJzYW89IjMuMTAiIElkPSJORmUzNTE4MDEwNDcxMDE0OTAwMDExNTU1MDAxMDAwMDA4NDAzMTAwMDA4NDAzNiI+PGlkZT48Y1VGPjM1PC9jVUY+PGNORj4wMDAwODQwMzwvY05GPjxuYXRPcD5WRU5EQSBBIENPTlNVTUlET1I8L25hdE9wPjxpbmRQYWc+MDwvaW5kUGFnPjxtb2Q+NTU8L21vZD48c2VyaWU+MTwvc2VyaWU+PG5ORj44NDAzPC9uTkY+PGRoRW1pPjIwMTgtMDEtMzBUMDA6MDA6MDAtMDI6MDA8L2RoRW1pPjxkaFNhaUVudD4yMDE4LTAxLTMwVDEzOjM2OjE1LTAyOjAwPC9kaFNhaUVudD48dHBORj4xPC90cE5GPjxpZERlc3Q+MTwvaWREZXN0PjxjTXVuRkc+MzU0ODkwNjwvY011bkZHPjx0cEltcD4xPC90cEltcD48dHBFbWlzPjE8L3RwRW1pcz48Y0RWPjY8L2NEVj48dHBBbWI+MTwvdHBBbWI+PGZpbk5GZT4xPC9maW5ORmU+PGluZEZpbmFsPjE8L2luZEZpbmFsPjxpbmRQcmVzPjE8L2luZFByZXM+PHByb2NFbWk+MDwvcHJvY0VtaT48dmVyUHJvYz4xLjAuMC4wPC92ZXJQcm9jPjwvaWRlPjxlbWl0PjxDTlBKPjA0NzEwMTQ5MDAwMTE1PC9DTlBKPjx4Tm9tZT5KYW5rZSBDb21lcmNpbyBGcmlvcyBMbHRkYSBFcHAuPC94Tm9tZT48eEZhbnQ+SHMgRnJpb3M8L3hGYW50PjxlbmRlckVtaXQ+PHhMZ3I+QXYgU2FvIENhcmxvczwveExncj48bnJvPjI4ODQ8L25ybz48eEJhaXJybz5DZW50cm88L3hCYWlycm8+PGNNdW4+MzU0ODkwNjwvY011bj48eE11bj5TQU8gQ0FSTE9TPC94TXVuPjxVRj5TUDwvVUY+PENFUD4xMzU2MDAwMjwvQ0VQPjxjUGFpcz4xMDU4PC9jUGFpcz48eFBhaXM+QlJBU0lMPC94UGFpcz48Zm9uZT4xNjMzNzI4ODIxPC9mb25lPjwvZW5kZXJFbWl0PjxJRT42MzcyNTAyOTIxMTI8L0lFPjxJTT4wNDI5MDA8L0lNPjxDTkFFPjQ3MjExMDM8L0NOQUU+PENSVD4xPC9DUlQ+PC9lbWl0PjxkZXN0PjxDTlBKPjE5NDI3MDMzMDAwMTQwPC9DTlBKPjx4Tm9tZT5BUlFVSVZFSSBTRVJWSUNPUyBPTiBMSU5FIExUREE8L3hOb21lPjxlbmRlckRlc3Q+PHhMZ3I+QVYgRE9VVE9SIENBUkxPUyBCT1RFTEhPPC94TGdyPjxucm8+MTg2MzwvbnJvPjx4QmFpcnJvPkNFTlRSTzwveEJhaXJybz48Y011bj4zNTQ4OTA2PC9jTXVuPjx4TXVuPlNBTyBDQVJMT1M8L3hNdW4+PFVGPlNQPC9VRj48Q0VQPjEzNTYwMjUwPC9DRVA+PGNQYWlzPjEwNTg8L2NQYWlzPjx4UGFpcz5CUkFTSUw8L3hQYWlzPjwvZW5kZXJEZXN0PjxpbmRJRURlc3Q+OTwvaW5kSUVEZXN0PjwvZGVzdD48ZGV0IG5JdGVtPSIxIj48cHJvZD48Y1Byb2Q+MTYwPC9jUHJvZD48Y0VBTiAvPjx4UHJvZD5QRUlUTyBQRVJVIERFRi4gRkFULjwveFByb2Q+PE5DTT4xNjAyMzEwMDwvTkNNPjxDRVNUPjE3MDg1MDA8L0NFU1Q+PENGT1A+NTQwNTwvQ0ZPUD48dUNvbT5LRzwvdUNvbT48cUNvbT4yLjAwMDA8L3FDb20+PHZVbkNvbT4zMy4zMDAwMDAwMDAwPC92VW5Db20+PHZQcm9kPjY2LjYwPC92UHJvZD48Y0VBTlRyaWIgLz48dVRyaWI+S0c8L3VUcmliPjxxVHJpYj4yLjAwMDA8L3FUcmliPjx2VW5UcmliPjMzLjMwMDAwMDAwMDA8L3ZVblRyaWI+PGluZFRvdD4xPC9pbmRUb3Q+PC9wcm9kPjxpbXBvc3RvPjx2VG90VHJpYj4xMC43OTwvdlRvdFRyaWI+PElDTVM+PElDTVNTTjUwMD48b3JpZz4wPC9vcmlnPjxDU09TTj41MDA8L0NTT1NOPjwvSUNNU1NONTAwPjwvSUNNUz48UElTPjxQSVNBbGlxPjxDU1Q+MDE8L0NTVD48dkJDPjAuMDA8L3ZCQz48cFBJUz4wLjAwMDA8L3BQSVM+PHZQSVM+MC4wMDwvdlBJUz48L1BJU0FsaXE+PC9QSVM+PENPRklOUz48Q09GSU5TQWxpcT48Q1NUPjAxPC9DU1Q+PHZCQz4wLjAwPC92QkM+PHBDT0ZJTlM+MC4wMDAwPC9wQ09GSU5TPjx2Q09GSU5TPjAuMDA8L3ZDT0ZJTlM+PC9DT0ZJTlNBbGlxPjwvQ09GSU5TPjwvaW1wb3N0bz48L2RldD48ZGV0IG5JdGVtPSIyIj48cHJvZD48Y1Byb2Q+MzAxPC9jUHJvZD48Y0VBTiAvPjx4UHJvZD5RVUVJSk8gTVVTU0FSRUxBIEZBVC4gRVNQRUNJQUw8L3hQcm9kPjxOQ00+MDQwNjEwMTA8L05DTT48Q0ZPUD41MTAyPC9DRk9QPjx1Q29tPktHPC91Q29tPjxxQ29tPjYuMDAwMDwvcUNvbT48dlVuQ29tPjE0LjQ5MDAwMDAwMDA8L3ZVbkNvbT48dlByb2Q+ODYuOTQ8L3ZQcm9kPjxjRUFOVHJpYiAvPjx1VHJpYj5LRzwvdVRyaWI+PHFUcmliPjYuMDAwMDwvcVRyaWI+PHZVblRyaWI+MTQuNDkwMDAwMDAwMDwvdlVuVHJpYj48aW5kVG90PjE8L2luZFRvdD48L3Byb2Q+PGltcG9zdG8+PHZUb3RUcmliPjE0LjA4PC92VG90VHJpYj48SUNNUz48SUNNU1NOMTAyPjxvcmlnPjA8L29yaWc+PENTT1NOPjEwMjwvQ1NPU04+PC9JQ01TU04xMDI+PC9JQ01TPjxQSVM+PFBJU0FsaXE+PENTVD4wMTwvQ1NUPjx2QkM+MC4wMDwvdkJDPjxwUElTPjAuMDAwMDwvcFBJUz48dlBJUz4wLjAwPC92UElTPjwvUElTQWxpcT48L1BJUz48Q09GSU5TPjxDT0ZJTlNBbGlxPjxDU1Q+MDE8L0NTVD48dkJDPjAuMDA8L3ZCQz48cENPRklOUz4wLjAwMDA8L3BDT0ZJTlM+PHZDT0ZJTlM+MC4wMDwvdkNPRklOUz48L0NPRklOU0FsaXE+PC9DT0ZJTlM+PC9pbXBvc3RvPjwvZGV0PjxkZXQgbkl0ZW09IjMiPjxwcm9kPjxjUHJvZD4zMjA8L2NQcm9kPjxjRUFOIC8+PHhQcm9kPkxPTUJJTkhPIERFRi4gRkFULiBST1NGUklPUzwveFByb2Q+PE5DTT4xNjAxMDAwMDwvTkNNPjxDRVNUPjE3MDgyMDA8L0NFU1Q+PENGT1A+NTQwNTwvQ0ZPUD48dUNvbT5LRzwvdUNvbT48cUNvbT4xLjUwMDA8L3FDb20+PHZVbkNvbT4xOC45MDAwMDAwMDAwPC92VW5Db20+PHZQcm9kPjI4LjM1PC92UHJvZD48Y0VBTlRyaWIgLz48dVRyaWI+S0c8L3VUcmliPjxxVHJpYj4xLjUwMDA8L3FUcmliPjx2VW5UcmliPjE4LjkwMDAwMDAwMDA8L3ZVblRyaWI+PGluZFRvdD4xPC9pbmRUb3Q+PC9wcm9kPjxpbXBvc3RvPjx2VG90VHJpYj41LjgwPC92VG90VHJpYj48SUNNUz48SUNNU1NONTAwPjxvcmlnPjA8L29yaWc+PENTT1NOPjUwMDwvQ1NPU04+PC9JQ01TU041MDA+PC9JQ01TPjxQSVM+PFBJU0FsaXE+PENTVD4wMTwvQ1NUPjx2QkM+MC4wMDwvdkJDPjxwUElTPjAuMDAwMDwvcFBJUz48dlBJUz4wLjAwPC92UElTPjwvUElTQWxpcT48L1BJUz48Q09GSU5TPjxDT0ZJTlNBbGlxPjxDU1Q+MDE8L0NTVD48dkJDPjAuMDA8L3ZCQz48cENPRklOUz4wLjAwMDA8L3BDT0ZJTlM+PHZDT0ZJTlM+MC4wMDwvdkNPRklOUz48L0NPRklOU0FsaXE+PC9DT0ZJTlM+PC9pbXBvc3RvPjwvZGV0PjxkZXQgbkl0ZW09IjQiPjxwcm9kPjxjUHJvZD40NDU8L2NQcm9kPjxjRUFOIC8+PHhQcm9kPlBSRVNVTlRPIEZBVC4gU1RBIFJPU0E8L3hQcm9kPjxOQ00+MTYwMjQ5MDA8L05DTT48Q0VTVD4xNzA4NTAwPC9DRVNUPjxDRk9QPjU0MDU8L0NGT1A+PHVDb20+S0c8L3VDb20+PHFDb20+Mi4wMDAwPC9xQ29tPjx2VW5Db20+MTIuNDkwMDAwMDAwMDwvdlVuQ29tPjx2UHJvZD4yNC45ODwvdlByb2Q+PGNFQU5UcmliIC8+PHVUcmliPktHPC91VHJpYj48cVRyaWI+Mi4wMDAwPC9xVHJpYj48dlVuVHJpYj4xMi40OTAwMDAwMDAwPC92VW5UcmliPjxpbmRUb3Q+MTwvaW5kVG90PjwvcHJvZD48aW1wb3N0bz48dlRvdFRyaWI+NC4wNTwvdlRvdFRyaWI+PElDTVM+PElDTVNTTjUwMD48b3JpZz4wPC9vcmlnPjxDU09TTj41MDA8L0NTT1NOPjwvSUNNU1NONTAwPjwvSUNNUz48UElTPjxQSVNBbGlxPjxDU1Q+MDE8L0NTVD48dkJDPjAuMDA8L3ZCQz48cFBJUz4wLjAwMDA8L3BQSVM+PHZQSVM+MC4wMDwvdlBJUz48L1BJU0FsaXE+PC9QSVM+PENPRklOUz48Q09GSU5TQWxpcT48Q1NUPjAxPC9DU1Q+PHZCQz4wLjAwPC92QkM+PHBDT0ZJTlM+MC4wMDAwPC9wQ09GSU5TPjx2Q09GSU5TPjAuMDA8L3ZDT0ZJTlM+PC9DT0ZJTlNBbGlxPjwvQ09GSU5TPjwvaW1wb3N0bz48L2RldD48ZGV0IG5JdGVtPSI1Ij48cHJvZD48Y1Byb2Q+ODAwPC9jUHJvZD48Y0VBTiAvPjx4UHJvZD5NT1JUQURFTEEgRkFULiBQRVJESUdBTzwveFByb2Q+PE5DTT4xNjAxMDAwMDwvTkNNPjxDRVNUPjE3MDgyMDA8L0NFU1Q+PENGT1A+NTQwNTwvQ0ZPUD48dUNvbT5LRzwvdUNvbT48cUNvbT4xLjUwMDA8L3FDb20+PHZVbkNvbT4xNS45MDAwMDAwMDAwPC92VW5Db20+PHZQcm9kPjIzLjg1PC92UHJvZD48Y0VBTlRyaWIgLz48dVRyaWI+S0c8L3VUcmliPjxxVHJpYj4xLjUwMDA8L3FUcmliPjx2VW5UcmliPjE1LjkwMDAwMDAwMDA8L3ZVblRyaWI+PGluZFRvdD4xPC9pbmRUb3Q+PC9wcm9kPjxpbXBvc3RvPjx2VG90VHJpYj40Ljg4PC92VG90VHJpYj48SUNNUz48SUNNU1NONTAwPjxvcmlnPjA8L29yaWc+PENTT1NOPjUwMDwvQ1NPU04+PC9JQ01TU041MDA+PC9JQ01TPjxQSVM+PFBJU0FsaXE+PENTVD4wMTwvQ1NUPjx2QkM+MC4wMDwvdkJDPjxwUElTPjAuMDAwMDwvcFBJUz48dlBJUz4wLjAwPC92UElTPjwvUElTQWxpcT48L1BJUz48Q09GSU5TPjxDT0ZJTlNBbGlxPjxDU1Q+MDE8L0NTVD48dkJDPjAuMDA8L3ZCQz48cENPRklOUz4wLjAwMDA8L3BDT0ZJTlM+PHZDT0ZJTlM+MC4wMDwvdkNPRklOUz48L0NPRklOU0FsaXE+PC9DT0ZJTlM+PC9pbXBvc3RvPjwvZGV0Pjx0b3RhbD48SUNNU1RvdD48dkJDPjAuMDA8L3ZCQz48dklDTVM+MC4wMDwvdklDTVM+PHZJQ01TRGVzb24+MC4wMDwvdklDTVNEZXNvbj48dkZDUFVGRGVzdD4wLjAwPC92RkNQVUZEZXN0Pjx2QkNTVD4wLjAwPC92QkNTVD48dlNUPjAuMDA8L3ZTVD48dlByb2Q+MjMwLjcyPC92UHJvZD48dkZyZXRlPjAuMDA8L3ZGcmV0ZT48dlNlZz4wLjAwPC92U2VnPjx2RGVzYz4wLjAwPC92RGVzYz48dklJPjAuMDA8L3ZJST48dklQST4wLjAwPC92SVBJPjx2UElTPjAuMDA8L3ZQSVM+PHZDT0ZJTlM+MC4wMDwvdkNPRklOUz48dk91dHJvPjAuMDA8L3ZPdXRybz48dk5GPjIzMC43Mjwvdk5GPjx2VG90VHJpYj4zOS42MDwvdlRvdFRyaWI+PC9JQ01TVG90PjwvdG90YWw+PHRyYW5zcD48bW9kRnJldGU+MDwvbW9kRnJldGU+PHZvbD48cVZvbD4xPC9xVm9sPjwvdm9sPjwvdHJhbnNwPjxjb2JyPjxkdXA+PG5EdXA+MDA4NDAzQTwvbkR1cD48ZFZlbmM+MjAxOC0wMi0wNjwvZFZlbmM+PHZEdXA+MjMwLjcyPC92RHVwPjwvZHVwPjwvY29icj48aW5mQWRpYz48aW5mQ3BsPlZhbG9yIGFwcm94aW1hZG8gZG9zIHRyaWJ1dG9zIFIkIDM5LDYwICgxNywxNiUpIEZvbnRlOiBJQlBUPC9pbmZDcGw+PC9pbmZBZGljPjwvaW5mTkZlPjxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxTaWduZWRJbmZvPjxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiIC8+PFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIgLz48UmVmZXJlbmNlIFVSST0iI05GZTM1MTgwMTA0NzEwMTQ5MDAwMTE1NTUwMDEwMDAwMDg0MDMxMDAwMDg0MDM2Ij48VHJhbnNmb3Jtcz48VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiIC8+PFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPjwvVHJhbnNmb3Jtcz48RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+PERpZ2VzdFZhbHVlPi9BUFd0VU9xN3ptS2JMajB6TXBQZ054MjFZQT08L0RpZ2VzdFZhbHVlPjwvUmVmZXJlbmNlPjwvU2lnbmVkSW5mbz48U2lnbmF0dXJlVmFsdWU+STZMeDhSdUZyWDJaclB1UXhBeFRxcVd0SVdSV3kvbGozaEFKY1dtVmovaVFDR2xIN0s1R1FLL1BydlR5dUJZVkhkSHo2bFFZNHF4cnhZWkxIam9sWDV6Q1RGVzRNaENvVEhCOWdMcTNXM2hqeGRiL3h3OVhLQWF0aWVwVkhGeEU5RUZNR0ZteDA4S1U0N0NabWhvRVhrRE1qYUxVMTNEL0lYVVBqSkU1amJkQ3dZWmtWYnp2R2RZSXpOSGFkcGVtYncrdndTNUpVNzhXeGFiazZTakFWUXdnLzJmQitTMkxRbXFxRWpxam03WGxYZXdFOVlMTDFuMmR2R1p4eGx1YUxaN21hYnpISVJqVXowYUZaYXRZTlo3UEZ1R2J4Vkc2bnZSVFlsVVhTMzhtS3ZYQ3BsRlpoMFdMS1V2TUNHSkRuZFZvdUdsV0MxUWhVMlVWRWNGN0hnPT08L1NpZ25hdHVyZVZhbHVlPjxLZXlJbmZvPjxYNTA5RGF0YT48WDUwOUNlcnRpZmljYXRlPk1JSUgrekNDQmVPZ0F3SUJBZ0lRWmxCM1E2TDk0UFBrSnMyRi9WM2hYREFOQmdrcWhraUc5dzBCQVFzRkFEQjRNUXN3Q1FZRFZRUUdFd0pDVWpFVE1CRUdBMVVFQ2hNS1NVTlFMVUp5WVhOcGJERTJNRFFHQTFVRUN4TXRVMlZqY21WMFlYSnBZU0JrWVNCU1pXTmxhWFJoSUVabFpHVnlZV3dnWkc4Z1FuSmhjMmxzSUMwZ1VrWkNNUnd3R2dZRFZRUURFeE5CUXlCRFpYSjBhWE5wWjI0Z1VrWkNJRWMxTUI0WERURTNNVEV5TXpFNE1qTTFNRm9YRFRFNU1URXlNekU0TWpNMU1Gb3dnZkV4Q3pBSkJnTlZCQVlUQWtKU01STXdFUVlEVlFRS0RBcEpRMUF0UW5KaGMybHNNUXN3Q1FZRFZRUUlEQUpUVURFVE1CRUdBMVVFQnd3S1UyRnZJRU5oY214dmN6RTJNRFFHQTFVRUN3d3RVMlZqY21WMFlYSnBZU0JrWVNCU1pXTmxhWFJoSUVabFpHVnlZV3dnWkc4Z1FuSmhjMmxzSUMwZ1VrWkNNUll3RkFZRFZRUUxEQTFTUmtJZ1pTMURUbEJLSUVFek1TSXdJQVlEVlFRTERCbEJkWFJsYm5ScFkyRmtieUJ3YjNJZ1FWSWdSa0ZEUlZOUU1UY3dOUVlEVlFRRERDNUtRVTVMUlNCRFQwMUZVa05KVHlCRVJTQkdVa2xQVXlCTVZFUkJJRTFGT2pBME56RXdNVFE1TURBd01URTFNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWtuK0RsZFo2bzM1T2pxNE9QUFhNdzRzWlFiOUNZeCtoTkU5ZzBUZDF1ZnFrcjdzbmNZd3JEWUV3RjN3TmFrTmlsVUtZZUQwamZyVmNlWFgzVWszL2diR1A1NExXcmNrSW1NSFlMSHJmWU51cGVMU0lIbHVkZC9VbzMxRUc1c3VKak9FVkNCenFaMCtYRDZ2djZMdnd3VG91aXpRLzRHeFFKT1hNSHpHVVE5bFdFQlJBYXZRZmY0cnlCMkF5ZWtTVnNPRU12UkxYZUk1SUl6VFJGNnU2N1BEU3h2bTlRVU8ydEhDNTQ3ZXc0czhObktDNkRoYTlDMmdiY0hCVktEbjhPdGlrSzVqK082b2hrRXo1Q1FaWVJkWnhycVVuUklJZDNocHFyRWcrZVJqV21nRURyMUtoTWYrL1NoQ1lTK2lGMVRqSnpjejBDVkw5UTZoei9DcXdXUUlEQVFBQm80SURCVENDQXdFd2diUUdBMVVkRVFTQnJEQ0JxYUEvQmdWZ1RBRURCS0EyQkRReU5UQXhNVGszTmpFMk1qQTVOek13T0RFM01EQXdNREF3TURBd01EQXdNREF3TURBd01qWTNOall5TWpaSlNWSkhSRk5Rb0I4R0JXQk1BUU1Db0JZRUZFcEZVMVZOSUVoRlRsSkpVVlZGSUVwQlRrdEZvQmtHQldCTUFRTURvQkFFRGpBME56RXdNVFE1TURBd01URTFvQmNHQldCTUFRTUhvQTRFRERBd01EQXdNREF3TURBd01JRVJhSE5tY21sdmMwQm5iV0ZwYkM1amIyMHdDUVlEVlIwVEJBSXdBREFmQmdOVkhTTUVHREFXZ0JSVGZYK2R2dEZoMENDNjJwL2ppYWNUYzFqTlFqQi9CZ05WSFNBRWVEQjJNSFFHQm1CTUFRSURCakJxTUdnR0NDc0dBUVVGQndJQkZseG9kSFJ3T2k4dmFXTndMV0p5WVhOcGJDNWpaWEowYVhOcFoyNHVZMjl0TG1KeUwzSmxjRzl6YVhSdmNtbHZMMlJ3WXk5QlExOURaWEowYVhOcFoyNWZVa1pDTDBSUVExOUJRMTlEWlhKMGFYTnBaMjVmVWtaQ0xuQmtaakNCdkFZRFZSMGZCSUcwTUlHeE1GZWdWYUJUaGxGb2RIUndPaTh2YVdOd0xXSnlZWE5wYkM1alpYSjBhWE5wWjI0dVkyOXRMbUp5TDNKbGNHOXphWFJ2Y21sdkwyeGpjaTlCUTBObGNuUnBjMmxuYmxKR1FrYzFMMHhoZEdWemRFTlNUQzVqY213d1ZxQlVvRktHVUdoMGRIQTZMeTlwWTNBdFluSmhjMmxzTG05MWRISmhiR055TG1OdmJTNWljaTl5WlhCdmMybDBiM0pwYnk5c1kzSXZRVU5EWlhKMGFYTnBaMjVTUmtKSE5TOU1ZWFJsYzNSRFVrd3VZM0pzTUE0R0ExVWREd0VCL3dRRUF3SUY0REFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQWdZSUt3WUJCUVVIQXdRd2dhd0dDQ3NHQVFVRkJ3RUJCSUdmTUlHY01GOEdDQ3NHQVFVRkJ6QUNobE5vZEhSd09pOHZhV053TFdKeVlYTnBiQzVqWlhKMGFYTnBaMjR1WTI5dExtSnlMM0psY0c5emFYUnZjbWx2TDJObGNuUnBabWxqWVdSdmN5OUJRMTlEWlhKMGFYTnBaMjVmVWtaQ1gwYzFMbkEzWXpBNUJnZ3JCZ0VGQlFjd0FZWXRhSFIwY0RvdkwyOWpjM0F0WVdNdFkyVnlkR2x6YVdkdUxYSm1ZaTVqWlhKMGFYTnBaMjR1WTI5dExtSnlNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFLdWFyVkNjR0grQ1M4SG5uSjBzYnJSd2Q5VUZjTzRuRFZFbWFsNGIxcVJKQXluWngyUjU2WVNQTXM2M1NQdy81aXNaQzQrZDNtZ3BsYk5XS3lic2RBU3B0ODVYVkxoVGUxWGYva2VSd3pZRmhOVTZoUm9aVlJMRHJiTkJpN3FTTndFd0ZEekJHZlh2ZnZ3ZTQwcCttdlVkNC9KZUJvWnZzNkJkbkRpWkdBZ05jMGdrTDh2MkhBQzFhK1FRb3Z4ZDQ4Ky81NEFBUE0yaGZmWk9aOGwwTGw0eENqYW5yTUxCY3dPdkZaTldTRVp5MVVCVnFYcmQxTVliU1l4UnFnZEFIQUcyQnovanRNYmt6d2R5UFJNUmUwRy84YXFWQ0R0dnZwMEdYSUR2cE1jbk5ucjMzbzB4QVg3T2dMcjY2U3M3QnlHazhrUm53UGFMTWlaenVHd2pDeGxRb3BYckxWWndhZ2E3M2dTc1diVXJyMzVwYVBHM3daSHhwSytmUDhJSXFad0R1blZrK1pMQ0pkdTdjWG5pTWNGdGxMNWhhR1pIYmtybWNOc0JGQTFFNndud0hmT3dpdGM1WE1EcnZyVFplY2lkQkxkemZyNGQ5Z2YyUm40KzF2QkdObFdZSGVLK3MvYTZMTWc5YWJobVRWR3JKd0NwTG5BYXU2VllQMUMrQ3U1ek9CWEx6T3d4dnk4Q0dKNjhLN3pJZTE2THpNbTZROVRpeURPT2NMVzAxSktvYVk2U1I1ejhUWVVSSk9qa1A2R1pYOGVEakdkR1NSRHRnUXB4SWlqNEQydEpkSTZ5QUtvUzV5SFQ2RjZyb3o0aS85azVGczZQK25yNVNqc3E4eHJqZXlOSGtDQ1RPcXdzMmF4dEVGamt0ZWk5M2pFdzRnQXMyNU82NHBpdz09PC9YNTA5Q2VydGlmaWNhdGU+PC9YNTA5RGF0YT48L0tleUluZm8+PC9TaWduYXR1cmU+PC9ORmU+PHByb3RORmUgdmVyc2FvPSIzLjEwIj48aW5mUHJvdCBJZD0iSWQxMzUxODAwNjc0MDE0MDciPjx0cEFtYj4xPC90cEFtYj48dmVyQXBsaWM+U1BfTkZFX1BMXzAwOGkyPC92ZXJBcGxpYz48Y2hORmU+MzUxODAxMDQ3MTAxNDkwMDAxMTU1NTAwMTAwMDAwODQwMzEwMDAwODQwMzY8L2NoTkZlPjxkaFJlY2J0bz4yMDE4LTAxLTMwVDEzOjQ5OjMzLTAyOjAwPC9kaFJlY2J0bz48blByb3Q+MTM1MTgwMDY3NDAxNDA3PC9uUHJvdD48ZGlnVmFsPi9BUFd0VU9xN3ptS2JMajB6TXBQZ054MjFZQT08L2RpZ1ZhbD48Y1N0YXQ+MTAwPC9jU3RhdD48eE1vdGl2bz5BdXRvcml6YWRvIG8gdXNvIGRhIE5GLWU8L3hNb3Rpdm8+PC9pbmZQcm90PjwvcHJvdE5GZT48L25mZVByb2M+"
}