{"configuration":{"scope":"SoftwareSystem"},"description":"Architecture diagram for the Naviway mobile app and API system","documentation":{},"id":2,"lastModifiedAgent":"structurizr-cli/","lastModifiedDate":"2025-10-10T07:56:50Z","lastModifiedUser":"michaelbrung@MacBook-Pro-de-Michael.local","model":{"deploymentNodes":[{"containerInstances":[{"containerId":"7","deploymentGroups":["Default"],"environment":"Production","id":"46","instanceId":1,"properties":{"structurizr.dsl.identifier":"mobileappinstance"},"relationships":[{"description":"Makes API requests [HTTPS/REST]","destinationId":"49","id":"50","linkedRelationshipId":"21","sourceId":"46","technology":"JSON/HTTPS"},{"description":"Downloads customer/contact data [HTTPS]","destinationId":"62","id":"63","linkedRelationshipId":"44","sourceId":"46","technology":"JSON files"}],"tags":"Container Instance"}],"environment":"Production","id":"45","instances":"1","name":"Mobile Device","properties":{"structurizr.dsl.identifier":"d60421a4-79ce-417f-9f0f-bb852afce957"},"tags":"Element,Deployment Node","technology":"iOS/Android"},{"children":[{"containerInstances":[{"containerId":"8","deploymentGroups":["Default"],"environment":"Production","id":"49","instanceId":1,"properties":{"structurizr.dsl.identifier":"apiserverinstance"},"relationships":[{"description":"Queries business data [HTTPS]","destinationId":"53","id":"54","linkedRelationshipId":"34","sourceId":"49","technology":"OData v4, NTLM Auth"},{"description":"Validates JWT tokens [HTTPS]","destinationId":"56","id":"57","linkedRelationshipId":"31","sourceId":"49","technology":"JWKS"},{"description":"Sends telemetry data [HTTPS]","destinationId":"59","id":"60","linkedRelationshipId":"37","sourceId":"49"}],"tags":"Container Instance"}],"environment":"Production","id":"48","instances":"1","name":"API Server","properties":{"structurizr.dsl.identifier":"1236c3e8-0bd9-47aa-bf1a-349c069ecc62"},"tags":"Element,Deployment Node","technology":"Go Runtime"}],"environment":"Production","id":"47","instances":"1","name":"Cloud Platform","properties":{"structurizr.dsl.identifier":"d4ddb9b1-c618-48d9-93a0-06be8b2bdbec"},"tags":"Element,Deployment Node","technology":"Server Infrastructure"},{"children":[{"environment":"Production","id":"52","instances":"1","name":"NAV Server","properties":{"structurizr.dsl.identifier":"ddf9425b-cca5-42bb-ac6f-ec1c6cb2401c"},"softwareSystemInstances":[{"deploymentGroups":["Default"],"environment":"Production","id":"53","instanceId":1,"properties":{"structurizr.dsl.identifier":"navisioninstance"},"softwareSystemId":"3","tags":"Software System Instance"}],"tags":"Element,Deployment Node","technology":"Windows Server"}],"environment":"Production","id":"51","instances":"1","name":"On-Premise","properties":{"structurizr.dsl.identifier":"b41bb6d8-e67d-4777-8d36-3067fa611427"},"tags":"Element,Deployment Node","technology":"Corporate Network"},{"environment":"Production","id":"55","instances":"1","name":"Microsoft Cloud","properties":{"structurizr.dsl.identifier":"f14182aa-e15f-428e-aa6e-3075b32b8554"},"softwareSystemInstances":[{"deploymentGroups":["Default"],"environment":"Production","id":"56","instanceId":1,"properties":{"structurizr.dsl.identifier":"azureadinstance"},"softwareSystemId":"2","tags":"Software System Instance"}],"tags":"Element,Deployment Node","technology":"Azure"},{"environment":"Production","id":"58","instances":"1","name":"SaaS","properties":{"structurizr.dsl.identifier":"1175b498-b531-458b-b794-051f4fd57138"},"softwareSystemInstances":[{"deploymentGroups":["Default"],"environment":"Production","id":"59","instanceId":1,"properties":{"structurizr.dsl.identifier":"newrelicinstance"},"softwareSystemId":"4","tags":"Software System Instance"}],"tags":"Element,Deployment Node","technology":"Cloud"},{"environment":"Production","id":"61","instances":"1","name":"Clever Cloud","properties":{"structurizr.dsl.identifier":"c244053c-4569-49b8-8f6c-4e924a1e4512"},"softwareSystemInstances":[{"deploymentGroups":["Default"],"environment":"Production","id":"62","instanceId":1,"properties":{"structurizr.dsl.identifier":"cellarinstance"},"softwareSystemId":"5","tags":"Software System Instance"}],"tags":"Element,Deployment Node","technology":"Platform as a Service"}],"people":[{"description":"Salesperson using the mobile application","id":"1","location":"Unspecified","name":"Mobile App User","properties":{"structurizr.dsl.identifier":"mobileuser"},"relationships":[{"description":"Uses to access customer data","destinationId":"7","id":"18","sourceId":"1","tags":"Relationship"},{"description":"Uses to access customer data","destinationId":"6","id":"19","linkedRelationshipId":"18","sourceId":"1"}],"tags":"Element,Person"}],"softwareSystems":[{"description":"Microsoft identity platform for authentication","documentation":{},"id":"2","location":"Unspecified","name":"Azure Active Directory","properties":{"structurizr.dsl.identifier":"azuread"},"tags":"Element,Software System,External"},{"description":"ERP system containing business data (customers, salespeople)","documentation":{},"id":"3","location":"Unspecified","name":"Microsoft Dynamics NAV","properties":{"structurizr.dsl.identifier":"navision"},"tags":"Element,Software System,External"},{"description":"Application performance monitoring","documentation":{},"id":"4","location":"Unspecified","name":"New Relic","properties":{"structurizr.dsl.identifier":"newrelic"},"tags":"Element,Software System,External"},{"description":"S3-compatible object storage for NAV data artifacts (customers, contacts)","documentation":{},"id":"5","location":"Unspecified","name":"Clever Cloud Cellar","properties":{"structurizr.dsl.identifier":"cellar"},"tags":"Element,Software System,External"},{"containers":[{"description":"Native mobile application for salespeople","documentation":{},"id":"7","name":"Mobile App","properties":{"structurizr.dsl.identifier":"mobileapp"},"relationships":[{"description":"Makes API requests [HTTPS/REST]","destinationId":"9","id":"20","sourceId":"7","tags":"Relationship","technology":"JSON/HTTPS"},{"description":"Makes API requests [HTTPS/REST]","destinationId":"8","id":"21","linkedRelationshipId":"20","sourceId":"7","technology":"JSON/HTTPS"},{"description":"Downloads customer/contact data [HTTPS]","destinationId":"5","id":"44","sourceId":"7","tags":"Relationship","technology":"JSON files"}],"tags":"Element,Container,Mobile","technology":"iOS/Android"},{"components":[{"description":"Routes HTTP requests to handlers","documentation":{},"id":"9","name":"API Router","properties":{"structurizr.dsl.identifier":"apirouter"},"relationships":[{"description":"Passes requests through","destinationId":"16","id":"22","sourceId":"9","tags":"Relationship"}],"tags":"Element,Component","technology":"Gin Router"},{"description":"Validates MSAL Bearer tokens","documentation":{},"id":"10","name":"Authentication Middleware","properties":{"structurizr.dsl.identifier":"authmiddleware"},"relationships":[{"description":"Routes /api/v1/health","destinationId":"11","id":"24","sourceId":"10","tags":"Relationship"},{"description":"Routes /api/v1/salespeople","destinationId":"12","id":"25","sourceId":"10","tags":"Relationship"},{"description":"Routes /api/v1/salespeople/:id/manifest","destinationId":"13","id":"26","sourceId":"10","tags":"Relationship"},{"description":"Validates JWT tokens [HTTPS]","destinationId":"2","id":"30","sourceId":"10","tags":"Relationship","technology":"JWKS"}],"tags":"Element,Component","technology":"auth/msal.go"},{"description":"Health check endpoint","documentation":{},"id":"11","name":"Health Handler","properties":{"structurizr.dsl.identifier":"healthhandler"},"tags":"Element,Component","technology":"handlers/health.go"},{"description":"Salespeople endpoint handler","documentation":{},"id":"12","name":"Vendors Handler","properties":{"structurizr.dsl.identifier":"vendorshandler"},"relationships":[{"description":"Gets salespeople data","destinationId":"14","id":"27","sourceId":"12","tags":"Relationship"}],"tags":"Element,Component","technology":"handlers/vendors.go"},{"description":"Salesperson manifest endpoint handler","documentation":{},"id":"13","name":"Manifest Handler","properties":{"structurizr.dsl.identifier":"manifesthandler"},"relationships":[{"description":"Gets manifest URLs","destinationId":"14","id":"28","sourceId":"13","tags":"Relationship"}],"tags":"Element,Component","technology":"handlers/manifest.go"},{"description":"Communicates with NAV OData API","documentation":{},"id":"14","name":"Navision Client","properties":{"structurizr.dsl.identifier":"navisionclient"},"relationships":[{"description":"Delegates customer queries","destinationId":"15","id":"29","sourceId":"14","tags":"Relationship"},{"description":"Queries business data [HTTPS]","destinationId":"3","id":"33","sourceId":"14","tags":"Relationship","technology":"OData v4, NTLM Auth"}],"tags":"Element,Component","technology":"navision/client.go"},{"description":"Retrieves customer data from NAV","documentation":{},"id":"15","name":"Customers Service","properties":{"structurizr.dsl.identifier":"customersservice"},"tags":"Element,Component","technology":"navision/customers.go"},{"description":"Application performance monitoring integration","documentation":{},"id":"16","name":"New Relic Middleware","properties":{"structurizr.dsl.identifier":"nrmiddleware"},"relationships":[{"description":"Validates authentication","destinationId":"10","id":"23","sourceId":"16","tags":"Relationship"},{"description":"Sends telemetry data [HTTPS]","destinationId":"4","id":"36","sourceId":"16","tags":"Relationship"}],"tags":"Element,Component","technology":"nrgin"}],"description":"RESTful API providing authenticated access to NAV data","documentation":{},"id":"8","name":"Naviway API Server","properties":{"structurizr.dsl.identifier":"apiserver"},"relationships":[{"description":"Validates JWT tokens [HTTPS]","destinationId":"2","id":"31","linkedRelationshipId":"30","sourceId":"8","technology":"JWKS"},{"description":"Queries business data [HTTPS]","destinationId":"3","id":"34","linkedRelationshipId":"33","sourceId":"8","technology":"OData v4, NTLM Auth"},{"description":"Sends telemetry data [HTTPS]","destinationId":"4","id":"37","linkedRelationshipId":"36","sourceId":"8"}],"tags":"Element,Container","technology":"Go, Gin Framework"},{"description":"Command-line tool for syncing NAV data","documentation":{},"id":"17","name":"CLI Sync Tool","properties":{"structurizr.dsl.identifier":"clitool"},"relationships":[{"description":"Uses to fetch NAV data","destinationId":"14","id":"39","sourceId":"17","tags":"Relationship"},{"description":"Uses to fetch NAV data","destinationId":"8","id":"40","linkedRelationshipId":"39","sourceId":"17"},{"description":"Syncs data from [HTTPS]","destinationId":"3","id":"41","sourceId":"17","tags":"Relationship","technology":"OData v4"},{"description":"Uploads data artifacts [HTTPS]","destinationId":"5","id":"42","sourceId":"17","tags":"Relationship","technology":"JSON files"}],"tags":"Element,Container,CLI","technology":"Go, Cobra"}],"description":"Provides mobile access to NAV data with authentication","documentation":{},"id":"6","location":"Unspecified","name":"Naviway System","properties":{"structurizr.dsl.identifier":"naviwaysystem"},"relationships":[{"description":"Validates JWT tokens [HTTPS]","destinationId":"2","id":"32","linkedRelationshipId":"30","sourceId":"6","technology":"JWKS"},{"description":"Queries business data [HTTPS]","destinationId":"3","id":"35","linkedRelationshipId":"33","sourceId":"6","technology":"OData v4, NTLM Auth"},{"description":"Sends telemetry data [HTTPS]","destinationId":"4","id":"38","linkedRelationshipId":"36","sourceId":"6"},{"description":"Uploads data artifacts [HTTPS]","destinationId":"5","id":"43","linkedRelationshipId":"42","sourceId":"6","technology":"JSON files"}],"tags":"Element,Software System"}]},"name":"Naviway API System","properties":{"structurizr.dsl":"d29ya3NwYWNlICJOYXZpd2F5IEFQSSBTeXN0ZW0iICJBcmNoaXRlY3R1cmUgZGlhZ3JhbSBmb3IgdGhlIE5hdml3YXkgbW9iaWxlIGFwcCBhbmQgQVBJIHN5c3RlbSIgewoKICAgIG1vZGVsIHsKICAgICAgICAjIFBlb3BsZQogICAgICAgIG1vYmlsZVVzZXIgPSBwZXJzb24gIk1vYmlsZSBBcHAgVXNlciIgIlNhbGVzcGVyc29uIHVzaW5nIHRoZSBtb2JpbGUgYXBwbGljYXRpb24iCgogICAgICAgICMgRXh0ZXJuYWwgU3lzdGVtcwogICAgICAgIGF6dXJlQUQgPSBzb2Z0d2FyZVN5c3RlbSAiQXp1cmUgQWN0aXZlIERpcmVjdG9yeSIgIk1pY3Jvc29mdCBpZGVudGl0eSBwbGF0Zm9ybSBmb3IgYXV0aGVudGljYXRpb24iICJFeHRlcm5hbCIKICAgICAgICBuYXZpc2lvbiA9IHNvZnR3YXJlU3lzdGVtICJNaWNyb3NvZnQgRHluYW1pY3MgTkFWIiAiRVJQIHN5c3RlbSBjb250YWluaW5nIGJ1c2luZXNzIGRhdGEgKGN1c3RvbWVycywgc2FsZXNwZW9wbGUpIiAiRXh0ZXJuYWwiCiAgICAgICAgbmV3UmVsaWMgPSBzb2Z0d2FyZVN5c3RlbSAiTmV3IFJlbGljIiAiQXBwbGljYXRpb24gcGVyZm9ybWFuY2UgbW9uaXRvcmluZyIgIkV4dGVybmFsIgogICAgICAgIGNlbGxhciA9IHNvZnR3YXJlU3lzdGVtICJDbGV2ZXIgQ2xvdWQgQ2VsbGFyIiAiUzMtY29tcGF0aWJsZSBvYmplY3Qgc3RvcmFnZSBmb3IgTkFWIGRhdGEgYXJ0aWZhY3RzIChjdXN0b21lcnMsIGNvbnRhY3RzKSIgIkV4dGVybmFsIgoKICAgICAgICAjIE1haW4gU3lzdGVtCiAgICAgICAgbmF2aXdheVN5c3RlbSA9IHNvZnR3YXJlU3lzdGVtICJOYXZpd2F5IFN5c3RlbSIgIlByb3ZpZGVzIG1vYmlsZSBhY2Nlc3MgdG8gTkFWIGRhdGEgd2l0aCBhdXRoZW50aWNhdGlvbiIgewogICAgICAgICAgICAjIE1vYmlsZSBBcHAKICAgICAgICAgICAgbW9iaWxlQXBwID0gY29udGFpbmVyICJNb2JpbGUgQXBwIiAiTmF0aXZlIG1vYmlsZSBhcHBsaWNhdGlvbiBmb3Igc2FsZXNwZW9wbGUiICJpT1MvQW5kcm9pZCIgewogICAgICAgICAgICAgICAgdGFncyAiTW9iaWxlIgogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEFQSSBTZXJ2ZXIKICAgICAgICAgICAgYXBpU2VydmVyID0gY29udGFpbmVyICJOYXZpd2F5IEFQSSBTZXJ2ZXIiICJSRVNUZnVsIEFQSSBwcm92aWRpbmcgYXV0aGVudGljYXRlZCBhY2Nlc3MgdG8gTkFWIGRhdGEiICJHbywgR2luIEZyYW1ld29yayIgewoKICAgICAgICAgICAgICAgICMgQ29tcG9uZW50cyB3aXRoaW4gQVBJIFNlcnZlcgogICAgICAgICAgICAgICAgYXBpUm91dGVyID0gY29tcG9uZW50ICJBUEkgUm91dGVyIiAiUm91dGVzIEhUVFAgcmVxdWVzdHMgdG8gaGFuZGxlcnMiICJHaW4gUm91dGVyIgogICAgICAgICAgICAgICAgYXV0aE1pZGRsZXdhcmUgPSBjb21wb25lbnQgIkF1dGhlbnRpY2F0aW9uIE1pZGRsZXdhcmUiICJWYWxpZGF0ZXMgTVNBTCBCZWFyZXIgdG9rZW5zIiAiYXV0aC9tc2FsLmdvIgoKICAgICAgICAgICAgICAgICMgSGFuZGxlcnMKICAgICAgICAgICAgICAgIGhlYWx0aEhhbmRsZXIgPSBjb21wb25lbnQgIkhlYWx0aCBIYW5kbGVyIiAiSGVhbHRoIGNoZWNrIGVuZHBvaW50IiAiaGFuZGxlcnMvaGVhbHRoLmdvIgogICAgICAgICAgICAgICAgdmVuZG9yc0hhbmRsZXIgPSBjb21wb25lbnQgIlZlbmRvcnMgSGFuZGxlciIgIlNhbGVzcGVvcGxlIGVuZHBvaW50IGhhbmRsZXIiICJoYW5kbGVycy92ZW5kb3JzLmdvIgogICAgICAgICAgICAgICAgbWFuaWZlc3RIYW5kbGVyID0gY29tcG9uZW50ICJNYW5pZmVzdCBIYW5kbGVyIiAiU2FsZXNwZXJzb24gbWFuaWZlc3QgZW5kcG9pbnQgaGFuZGxlciIgImhhbmRsZXJzL21hbmlmZXN0LmdvIgoKICAgICAgICAgICAgICAgICMgQnVzaW5lc3MgTG9naWMKICAgICAgICAgICAgICAgIG5hdmlzaW9uQ2xpZW50ID0gY29tcG9uZW50ICJOYXZpc2lvbiBDbGllbnQiICJDb21tdW5pY2F0ZXMgd2l0aCBOQVYgT0RhdGEgQVBJIiAibmF2aXNpb24vY2xpZW50LmdvIgogICAgICAgICAgICAgICAgY3VzdG9tZXJzU2VydmljZSA9IGNvbXBvbmVudCAiQ3VzdG9tZXJzIFNlcnZpY2UiICJSZXRyaWV2ZXMgY3VzdG9tZXIgZGF0YSBmcm9tIE5BViIgIm5hdmlzaW9uL2N1c3RvbWVycy5nbyIKCiAgICAgICAgICAgICAgICAjIE1vbml0b3JpbmcKICAgICAgICAgICAgICAgIG5yTWlkZGxld2FyZSA9IGNvbXBvbmVudCAiTmV3IFJlbGljIE1pZGRsZXdhcmUiICJBcHBsaWNhdGlvbiBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIGludGVncmF0aW9uIiAibnJnaW4iCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ0xJIFRvb2xzCiAgICAgICAgICAgIGNsaVRvb2wgPSBjb250YWluZXIgIkNMSSBTeW5jIFRvb2wiICJDb21tYW5kLWxpbmUgdG9vbCBmb3Igc3luY2luZyBOQVYgZGF0YSIgIkdvLCBDb2JyYSIgewogICAgICAgICAgICAgICAgdGFncyAiQ0xJIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFJlbGF0aW9uc2hpcHMgLSBVc2VyIHRvIFN5c3RlbXMKICAgICAgICBtb2JpbGVVc2VyIC0+IG1vYmlsZUFwcCAiVXNlcyB0byBhY2Nlc3MgY3VzdG9tZXIgZGF0YSIKCiAgICAgICAgIyBSZWxhdGlvbnNoaXBzIC0gTW9iaWxlIEFwcCB0byBBUEkKICAgICAgICBtb2JpbGVBcHAgLT4gYXBpUm91dGVyICJNYWtlcyBBUEkgcmVxdWVzdHMgW0hUVFBTL1JFU1RdIiAiSlNPTi9IVFRQUyIKCiAgICAgICAgIyBSZWxhdGlvbnNoaXBzIC0gQVBJIFJvdXRlciB0byBNaWRkbGV3YXJlCiAgICAgICAgYXBpUm91dGVyIC0+IG5yTWlkZGxld2FyZSAiUGFzc2VzIHJlcXVlc3RzIHRocm91Z2giCiAgICAgICAgbnJNaWRkbGV3YXJlIC0+IGF1dGhNaWRkbGV3YXJlICJWYWxpZGF0ZXMgYXV0aGVudGljYXRpb24iCgogICAgICAgICMgUmVsYXRpb25zaGlwcyAtIE1pZGRsZXdhcmUgdG8gSGFuZGxlcnMKICAgICAgICBhdXRoTWlkZGxld2FyZSAtPiBoZWFsdGhIYW5kbGVyICJSb3V0ZXMgL2FwaS92MS9oZWFsdGgiCiAgICAgICAgYXV0aE1pZGRsZXdhcmUgLT4gdmVuZG9yc0hhbmRsZXIgIlJvdXRlcyAvYXBpL3YxL3NhbGVzcGVvcGxlIgogICAgICAgIGF1dGhNaWRkbGV3YXJlIC0+IG1hbmlmZXN0SGFuZGxlciAiUm91dGVzIC9hcGkvdjEvc2FsZXNwZW9wbGUvOmlkL21hbmlmZXN0IgoKICAgICAgICAjIFJlbGF0aW9uc2hpcHMgLSBIYW5kbGVycyB0byBTZXJ2aWNlcwogICAgICAgIHZlbmRvcnNIYW5kbGVyIC0+IG5hdmlzaW9uQ2xpZW50ICJHZXRzIHNhbGVzcGVvcGxlIGRhdGEiCiAgICAgICAgbWFuaWZlc3RIYW5kbGVyIC0+IG5hdmlzaW9uQ2xpZW50ICJHZXRzIG1hbmlmZXN0IFVSTHMiCiAgICAgICAgbmF2aXNpb25DbGllbnQgLT4gY3VzdG9tZXJzU2VydmljZSAiRGVsZWdhdGVzIGN1c3RvbWVyIHF1ZXJpZXMiCgogICAgICAgICMgUmVsYXRpb25zaGlwcyAtIEFQSSB0byBFeHRlcm5hbCBTeXN0ZW1zCiAgICAgICAgYXV0aE1pZGRsZXdhcmUgLT4gYXp1cmVBRCAiVmFsaWRhdGVzIEpXVCB0b2tlbnMgW0hUVFBTXSIgIkpXS1MiCiAgICAgICAgbmF2aXNpb25DbGllbnQgLT4gbmF2aXNpb24gIlF1ZXJpZXMgYnVzaW5lc3MgZGF0YSBbSFRUUFNdIiAiT0RhdGEgdjQsIE5UTE0gQXV0aCIKICAgICAgICBuck1pZGRsZXdhcmUgLT4gbmV3UmVsaWMgIlNlbmRzIHRlbGVtZXRyeSBkYXRhIFtIVFRQU10iCgogICAgICAgICMgUmVsYXRpb25zaGlwcyAtIENMSSBUb29sCiAgICAgICAgY2xpVG9vbCAtPiBuYXZpc2lvbkNsaWVudCAiVXNlcyB0byBmZXRjaCBOQVYgZGF0YSIKICAgICAgICBjbGlUb29sIC0+IG5hdmlzaW9uICJTeW5jcyBkYXRhIGZyb20gW0hUVFBTXSIgIk9EYXRhIHY0IgogICAgICAgIGNsaVRvb2wgLT4gY2VsbGFyICJVcGxvYWRzIGRhdGEgYXJ0aWZhY3RzIFtIVFRQU10iICJKU09OIGZpbGVzIgoKICAgICAgICAjIFJlbGF0aW9uc2hpcHMgLSBNb2JpbGUgQXBwIHRvIENlbGxhcgogICAgICAgIG1vYmlsZUFwcCAtPiBjZWxsYXIgIkRvd25sb2FkcyBjdXN0b21lci9jb250YWN0IGRhdGEgW0hUVFBTXSIgIkpTT04gZmlsZXMiCgogICAgICAgICMgRGVwbG95bWVudAogICAgICAgIGRlcGxveW1lbnRFbnZpcm9ubWVudCAiUHJvZHVjdGlvbiIgewogICAgICAgICAgICBkZXBsb3ltZW50Tm9kZSAiTW9iaWxlIERldmljZSIgIiIgImlPUy9BbmRyb2lkIiB7CiAgICAgICAgICAgICAgICBtb2JpbGVBcHBJbnN0YW5jZSA9IGNvbnRhaW5lckluc3RhbmNlIG1vYmlsZUFwcAogICAgICAgICAgICB9CgogICAgICAgICAgICBkZXBsb3ltZW50Tm9kZSAiQ2xvdWQgUGxhdGZvcm0iICIiICJTZXJ2ZXIgSW5mcmFzdHJ1Y3R1cmUiIHsKICAgICAgICAgICAgICAgIGRlcGxveW1lbnROb2RlICJBUEkgU2VydmVyIiAiIiAiR28gUnVudGltZSIgewogICAgICAgICAgICAgICAgICAgIGFwaVNlcnZlckluc3RhbmNlID0gY29udGFpbmVySW5zdGFuY2UgYXBpU2VydmVyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlcGxveW1lbnROb2RlICJPbi1QcmVtaXNlIiAiIiAiQ29ycG9yYXRlIE5ldHdvcmsiIHsKICAgICAgICAgICAgICAgIGRlcGxveW1lbnROb2RlICJOQVYgU2VydmVyIiAiIiAiV2luZG93cyBTZXJ2ZXIiIHsKICAgICAgICAgICAgICAgICAgICBuYXZpc2lvbkluc3RhbmNlID0gc29mdHdhcmVTeXN0ZW1JbnN0YW5jZSBuYXZpc2lvbgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBkZXBsb3ltZW50Tm9kZSAiTWljcm9zb2Z0IENsb3VkIiAiIiAiQXp1cmUiIHsKICAgICAgICAgICAgICAgIGF6dXJlQURJbnN0YW5jZSA9IHNvZnR3YXJlU3lzdGVtSW5zdGFuY2UgYXp1cmVBRAogICAgICAgICAgICB9CgogICAgICAgICAgICBkZXBsb3ltZW50Tm9kZSAiU2FhUyIgIiIgIkNsb3VkIiB7CiAgICAgICAgICAgICAgICBuZXdSZWxpY0luc3RhbmNlID0gc29mdHdhcmVTeXN0ZW1JbnN0YW5jZSBuZXdSZWxpYwogICAgICAgICAgICB9CgogICAgICAgICAgICBkZXBsb3ltZW50Tm9kZSAiQ2xldmVyIENsb3VkIiAiIiAiUGxhdGZvcm0gYXMgYSBTZXJ2aWNlIiB7CiAgICAgICAgICAgICAgICBjZWxsYXJJbnN0YW5jZSA9IHNvZnR3YXJlU3lzdGVtSW5zdGFuY2UgY2VsbGFyCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgdmlld3MgewogICAgICAgIHN5c3RlbUNvbnRleHQgbmF2aXdheVN5c3RlbSAiU3lzdGVtQ29udGV4dCIgewogICAgICAgICAgICBpbmNsdWRlICoKICAgICAgICAgICAgYXV0b0xheW91dAogICAgICAgIH0KCiAgICAgICAgY29udGFpbmVyIG5hdml3YXlTeXN0ZW0gIkNvbnRhaW5lcnMiIHsKICAgICAgICAgICAgaW5jbHVkZSAqCiAgICAgICAgICAgIGF1dG9MYXlvdXQKICAgICAgICB9CgogICAgICAgIGNvbXBvbmVudCBhcGlTZXJ2ZXIgIkFQSUNvbXBvbmVudHMiIHsKICAgICAgICAgICAgaW5jbHVkZSAqCiAgICAgICAgICAgIGF1dG9MYXlvdXQKICAgICAgICB9CgogICAgICAgIGRlcGxveW1lbnQgbmF2aXdheVN5c3RlbSAiUHJvZHVjdGlvbiIgIlByb2R1Y3Rpb25EZXBsb3ltZW50IiB7CiAgICAgICAgICAgIGluY2x1ZGUgKgogICAgICAgICAgICBhdXRvTGF5b3V0CiAgICAgICAgfQoKICAgICAgICBzdHlsZXMgewogICAgICAgICAgICBlbGVtZW50ICJTb2Z0d2FyZSBTeXN0ZW0iIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQgIzExNjhiZAogICAgICAgICAgICAgICAgY29sb3IgI2ZmZmZmZgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsZW1lbnQgIkV4dGVybmFsIiB7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kICM5OTk5OTkKICAgICAgICAgICAgICAgIGNvbG9yICNmZmZmZmYKICAgICAgICAgICAgfQogICAgICAgICAgICBlbGVtZW50ICJDb250YWluZXIiIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQgIzQzOGRkNQogICAgICAgICAgICAgICAgY29sb3IgI2ZmZmZmZgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsZW1lbnQgIk1vYmlsZSIgewogICAgICAgICAgICAgICAgc2hhcGUgTW9iaWxlRGV2aWNlUG9ydHJhaXQKICAgICAgICAgICAgICAgIGJhY2tncm91bmQgIzM0YTg1MwogICAgICAgICAgICAgICAgY29sb3IgI2ZmZmZmZgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsZW1lbnQgIkNMSSIgewogICAgICAgICAgICAgICAgc2hhcGUgUGlwZQogICAgICAgICAgICAgICAgYmFja2dyb3VuZCAjZjRiNDAwCiAgICAgICAgICAgICAgICBjb2xvciAjMDAwMDAwCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxlbWVudCAiQ29tcG9uZW50IiB7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kICM4NWJiZjAKICAgICAgICAgICAgICAgIGNvbG9yICMwMDAwMDAKICAgICAgICAgICAgfQogICAgICAgICAgICBlbGVtZW50ICJQZXJzb24iIHsKICAgICAgICAgICAgICAgIHNoYXBlIHBlcnNvbgogICAgICAgICAgICAgICAgYmFja2dyb3VuZCAjMDg0MjdiCiAgICAgICAgICAgICAgICBjb2xvciAjZmZmZmZmCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoZW1lIGRlZmF1bHQKICAgIH0KCiAgICBjb25maWd1cmF0aW9uIHsKICAgICAgICBzY29wZSBzb2Z0d2FyZXN5c3RlbQogICAgfQp9"},"revision":2,"views":{"componentViews":[{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"TopBottom","rankSeparation":300,"vertices":false},"containerId":"8","elements":[{"id":"2","x":0,"y":0},{"id":"3","x":0,"y":0},{"id":"4","x":0,"y":0},{"id":"7","x":0,"y":0},{"id":"9","x":0,"y":0},{"id":"10","x":0,"y":0},{"id":"11","x":0,"y":0},{"id":"12","x":0,"y":0},{"id":"13","x":0,"y":0},{"id":"14","x":0,"y":0},{"id":"15","x":0,"y":0},{"id":"16","x":0,"y":0},{"id":"17","x":0,"y":0}],"externalContainerBoundariesVisible":false,"key":"APIComponents","order":3,"relationships":[{"id":"20"},{"id":"22"},{"id":"23"},{"id":"24"},{"id":"25"},{"id":"26"},{"id":"27"},{"id":"28"},{"id":"29"},{"id":"30"},{"id":"33"},{"id":"36"},{"id":"39"},{"id":"41"}]}],"configuration":{"branding":{},"styles":{"elements":[{"background":"#1168bd","color":"#ffffff","tag":"Software System"},{"background":"#999999","color":"#ffffff","tag":"External"},{"background":"#438dd5","color":"#ffffff","tag":"Container"},{"background":"#34a853","color":"#ffffff","shape":"MobileDevicePortrait","tag":"Mobile"},{"background":"#f4b400","color":"#000000","shape":"Pipe","tag":"CLI"},{"background":"#85bbf0","color":"#000000","tag":"Component"},{"background":"#08427b","color":"#ffffff","shape":"Person","tag":"Person"}]},"terminology":{},"themes":["https://static.structurizr.com/themes/default/theme.json"]},"containerViews":[{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"TopBottom","rankSeparation":300,"vertices":false},"elements":[{"id":"1","x":0,"y":0},{"id":"2","x":0,"y":0},{"id":"3","x":0,"y":0},{"id":"4","x":0,"y":0},{"id":"5","x":0,"y":0},{"id":"7","x":0,"y":0},{"id":"8","x":0,"y":0},{"id":"17","x":0,"y":0}],"externalSoftwareSystemBoundariesVisible":false,"key":"Containers","order":2,"relationships":[{"id":"18"},{"id":"21"},{"id":"31"},{"id":"34"},{"id":"37"},{"id":"40"},{"id":"41"},{"id":"42"},{"id":"44"}],"softwareSystemId":"6"}],"deploymentViews":[{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"TopBottom","rankSeparation":300,"vertices":false},"elements":[{"id":"45","x":0,"y":0},{"id":"46","x":0,"y":0},{"id":"47","x":0,"y":0},{"id":"48","x":0,"y":0},{"id":"49","x":0,"y":0},{"id":"51","x":0,"y":0},{"id":"52","x":0,"y":0},{"id":"53","x":0,"y":0},{"id":"55","x":0,"y":0},{"id":"56","x":0,"y":0},{"id":"58","x":0,"y":0},{"id":"59","x":0,"y":0},{"id":"61","x":0,"y":0},{"id":"62","x":0,"y":0}],"environment":"Production","key":"ProductionDeployment","order":4,"relationships":[{"id":"50"},{"id":"54"},{"id":"57"},{"id":"60"},{"id":"63"}],"softwareSystemId":"6"}],"systemContextViews":[{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"TopBottom","rankSeparation":300,"vertices":false},"elements":[{"id":"1","x":0,"y":0},{"id":"2","x":0,"y":0},{"id":"3","x":0,"y":0},{"id":"4","x":0,"y":0},{"id":"5","x":0,"y":0},{"id":"6","x":0,"y":0}],"enterpriseBoundaryVisible":true,"key":"SystemContext","order":1,"relationships":[{"id":"19"},{"id":"32"},{"id":"35"},{"id":"38"},{"id":"43"}],"softwareSystemId":"6"}]}}