From 836ae8854db97fffae79a1778667e6bf4f4cd2e4 Mon Sep 17 00:00:00 2001 From: Julius Rickert Date: Mon, 8 Mar 2021 14:50:14 +0100 Subject: [PATCH] NEW MACRO: DMARC_BUILDER (#1047) --- docs/dmarc-builder.md | 89 +++++++++++++++ pkg/js/helpers.js | 138 ++++++++++++++++++++++ pkg/js/static.go | 259 ++++++++++++++++++++++-------------------- 3 files changed, 364 insertions(+), 122 deletions(-) create mode 100644 docs/dmarc-builder.md diff --git a/docs/dmarc-builder.md b/docs/dmarc-builder.md new file mode 100644 index 000000000..4cf971759 --- /dev/null +++ b/docs/dmarc-builder.md @@ -0,0 +1,89 @@ +--- +layout: default +title: CAA Builder +--- + +# DMARC Builder + +dnscontrol contains a DMARC_BUILDER which can be used to simply create +DMARC policies for your domains. + + +## Example + +### Simple example + +```js +DMARC_BUILDER({ + policy: 'reject', + ruf: [ + 'mailto:mailauth-reports@example.com', + ], +}) +``` + +This yield the following record: +``` +@ IN TXT "v=DMARC1; p=reject; ruf=mailto:mailauth-reports@example.com" +``` + +### Advanced example + +```js +DMARC_BUILDER({ + policy: 'reject', + subdomainPolicy: 'quarantine', + percent: 50, + alignmentSPF: 'r', + alignmentDKIM: 'strict', + rua: [ + 'mailto:mailauth-reports@example.com', + 'https://dmarc.example.com/submit', + ], + ruf: [ + 'mailto:mailauth-reports@example.com', + ], + failureOptions: '1', + reportInterval: '1h', +}), + +DMARC_BUILDER({ + label: 'insecure', + policy: 'none', + ruf: [ + 'mailto:mailauth-reports@example.com', + ], + failureOptions: { + SPF: false, + DKIM: true, + }, +}) +``` + +This yields the following records: + +``` +@ IN TXT "v=DMARC1; p=reject; sp=quarantine; adkim=s; aspf=r; pct=50; rua=mailto:mailauth-reports@example.com,https://dmarc.example.com/submit; ruf=mailto:mailauth-reports@example.com; fo=1; ri=3600" +insecure IN TXT "v=DMARC1; p=none; ruf=mailto:mailauth-reports@example.com; fo=d" +``` + + +### Parameters + +* `label:` The DNS label for the DMARC record (`_dmarc` prefix is added, default: `'@'`) +* `policy:` The DMARC policy (`p=`), must be one of `'none'`, `'quarantine'`, `'reject'` +* `subdomainPolicy:` The DMARC policy for subdomains (`sp=`), must be one of `'none'`, `'quarantine'`, `'reject'` (optional) +* `alignmentSPF:` `'strict'`/`'s'` or `'relaxed'`/`'r'` alignment for SPF (`aspf=`, default: `'r'`) +* `alignmentDKIM:` `'strict'`/`'s'` or `'relaxed'`/`'r'` alignment for DKIM (`adkim=`, default: `'r'`) +* `percent:` Number between `0` and `100`, percentage for which policies are applied (`pct=`, default: `100`) +* `rua:` Array of aggregate report targets (optional) +* `ruf:` Array of failure report targets (optional) +* `failureOptions:` Object or string; Object containing booleans `SPF` and `DKIM`, string is passed raw (`fo=`, default: `'0'`) +* `failureFormat:` Format in which failure reports are requested (`rf=`, default: `'afrf'`) +* `reportInterval:` Interval in which reports are requested (`ri=`) +* `ttl:` Input for `TTL` method (optional) + +### Caveats + +* TXT records are automatically split using `AUTOSPLIT`. +* URIs in the `rua` and `ruf` arrays are passed raw. You must percent-encode all commas and exclamation points in the URI itself. diff --git a/pkg/js/helpers.js b/pkg/js/helpers.js index 5c4be4b8f..6d8eb26b2 100644 --- a/pkg/js/helpers.js +++ b/pkg/js/helpers.js @@ -919,6 +919,144 @@ function CAA_BUILDER(value) { return r; } +// DMARC_BUILDER takes an object: +// label: The DNS label for the DMARC record (_dmarc prefix is added; default: '@') +// policy: The DMARC policy (p=), must be one of 'none', 'quarantine', 'reject' +// subdomainPolicy: The DMARC policy for subdomains (sp=), must be one of 'none', 'quarantine', 'reject' (optional) +// alignmentSPF: 'strict'/'s' or 'relaxed'/'r' alignment for SPF (aspf=, default: 'r') +// alignmentDKIM: 'strict'/'s' or 'relaxed'/'r' alignment for DKIM (adkim=, default: 'r') +// percent: Number between 0 and 100, percentage for which policies are applied (pct=, default: 100) +// rua: Array of aggregate report targets (optional) +// ruf: Array of failure report targets (optional) +// failureOptions: Object or string; Object containing booleans SPF and DKIM, string is passed raw (fo=, default: '0') +// failureFormat: Format in which failure reports are requested (rf=, default: 'afrf') +// reportInterval: Interval in which reports are requested (ri=) +// ttl: Input for TTL method +function DMARC_BUILDER(value) { + if (!value) { + value = {}; + } + if (!value.label) { + value.label = '@'; + } + + var label = '_dmarc'; + if (value.label !== '@') { + label += '.' + value.label; + } + + if (!value.policy) { + value.policy = 'none'; + } + + if (!value.policy === 'none' || !value.policy === 'quarantine' || !value.policy === 'reject') { + throw 'Invalid DMARC policy'; + } + + var record = ['v=DMARC1']; + record.push('p=' + value.policy); + + // Subdomain policy + if (!value.subdomainPolicy === 'none' || !value.subdomainPolicy === 'quarantine' || !value.subdomainPolicy === 'reject') { + throw 'Invalid DMARC subdomain policy'; + } + if (value.subdomainPolicy) { + record.push('sp=' + value.subdomainPolicy); + } + + // Alignment DKIM + if (value.alignmentDKIM) { + switch (value.alignmentDKIM) { + case 'relaxed': + value.alignmentDKIM = 'r'; + break; + case 'strict': + value.alignmentDKIM = 's'; + break; + case 'r': + case 's': + break; + default: + throw 'Invalid DMARC DKIM alignment policy'; + } + record.push('adkim=' + value.alignmentDKIM); + } + + // Alignment SPF + if (value.alignmentSPF) { + switch (value.alignmentSPF) { + case 'relaxed': + value.alignmentSPF = 'r'; + break; + case 'strict': + value.alignmentSPF = 's'; + break; + case 'r': + case 's': + break; + default: + throw 'Invalid DMARC DKIM alignment policy'; + } + record.push('aspf=' + value.alignmentSPF); + } + + // Percentage + if (value.percent && value.percent != 100) { + record.push('pct=' + value.percent); + } + + // Aggregate reports + if (value.rua && value.rua.length > 0) { + record.push('rua=' + value.rua.join(',')); + } + + // Failure reports + if (value.ruf && value.ruf.length > 0) { + record.push('ruf=' + value.ruf.join(',')); + } + + // Failure reporting options + if (value.ruf && value.failureOptions) { + var fo = '0'; + if (_.isObject(value.failureOptions)) { + if (value.failureOptions.DKIM) { + fo = 'd'; + } + if (value.failureOptions.SPF) { + fo = 's'; + } + if (value.failureOptions.DKIM && value.failureOptions.SPF) { + fo = '1'; + } + } else { + fo = value.failureOptions; + } + + if (fo !== '0') { + record.push('fo=' + fo); + } + } + + // Failure report format + if (value.ruf && value.failureFormat && value.failureFormat !== 'afrf') { + record.push('rf=' + value.failureFormat); + } + + // Report interval + if (value.reportInterval) { + if (_.isString(value.reportInterval)) { + value.reportInterval = stringToDuration(value.reportInterval); + } + + record.push('ri=' + value.reportInterval); + } + + if (value.ttl) { + return TXT(label, record.join('; '), TTL(value.ttl)); + } + return TXT(label, record.join('; ')); +} + // This is a no-op. Long TXT records are handled natively now. function DKIM(arr) { return arr; diff --git a/pkg/js/static.go b/pkg/js/static.go index d948dd234..230ae6152 100644 --- a/pkg/js/static.go +++ b/pkg/js/static.go @@ -212,130 +212,145 @@ var _escData = map[string]*_escFile{ "/helpers.js": { name: "helpers.js", local: "pkg/js/helpers.js", - size: 27773, + size: 32062, modtime: 0, compressed: ` -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 -XJweqgOc/wkAAP//kV6oFn1sAAA= +H4sIAAAAAAAC/+x9/XPbOLLg7/4rOq57QylRZDvZzL6SV+9W649Z1/qrJGU2+3w+LSyCEhKK5AKgZc3E +87df4ZMACcqOb2em6uryw4wJNBqNRqPR3WhAUckwME7JnEeHOzt7e3CWwCYvAceEA18SBglJcU+WrUrG +gZYZ/HORwwJnmCKO/wk8B7y6w7EEFyhECyAZ8CUGlpd0jmGex7jv4kcUwxKje5JuIMZ35WJBsoXqUMD2 +ZOPdtzG+34UkRQtYkzQV7SlGcUUYxITiOU83QDLGRVWeQMkULgx5yYuSQ56Ilh7VffhHXkZpCoyTNIUM +C/rzwOjucJJTLNoLsuf5aiUZg2G+RNkCs/7Ozj2iMM+zBIbw8w4AAMULwjhFlA3g5rYny+KMzQqa35MY +e8X5CpGsUTDL0Arr0sdD1UWME1SmfEQXDIZwc3u4s5OU2ZyTPAOSEU5QSn7Cna4mwqOojaotlAWpezxU +RDZIeZSTO8a8pBkDlAGiFG3EbGgcsF6S+RLWmGJNCaY4BpZDIsZWUjFntMw4WUluX60zsMNLcsHhVYE4 +uSMp4RshBizPGOQUSAIsX2GI0QZYgecEpVDQfI6ZlIN1XqYx3Ile/1USiuN+xbYF5kd5lpBFSXF8rAi1 +DKRyMJKPfXdW5GAtiku8HhvGdkR9D/imwD1YYY4MKpJAR5R2nekQ3zAcQnQxuvw4Oo8UZx/lf8V0U7wQ +0wcC5wAqzAMH/0D+18yKpLSa5X5RsmWH4kX30B2PwNQYwnHGrrUIPDmIPFG9DgXx+d1nPOcRfPcdRKSY +zfPsHlNG8oxFQgW47cU/8d334WAopneF+IzzTqC+W2dMzIqXMMYTc8WbmBVP8SbDayUXmi2WvTUpqYbo +kGXLWHmnJGgAUdRrrshB9WfP49UAfn504ec5jZvL97pavS64XqXT6fkA9nsegQzT+8ZqJ4sspzh2dU+9 +iiO6wNxXCC679Lo7RnTBOqueXvyGV2JvyClgNF/CKo9JQjDtCbkiHAgD1O/3LZzGOIA5SlMBsCZ8qfEZ +IKljBqZTwZ6SMnKP042BUOIppIEusOwm47nkbIw4smI96xN2qnvsrLqexHb0GLQYAk4Zto1GgoJaCzHE +jhDUz3IFuFXin8+im8+3lkuHFu4x1NeVHEuts1kfP3CcxZrKvhhaD1Y+tY7SWdJ8DdHfR+PLs8sfBrpn +OxlKKZUZK4sipxzHA4jgjUe+0QC14giOjYDXajRhammpwanN4lgtqWpFDeCIYsQxIDi+nGiEffjIsNxw +C0TRCnNMGSBm1gKgLBbkM0erH7etVak91IiHW1a2ItNOI4Eh7B8CgT+5+14/xdmCLw+BvHnjTog3vQ78 +DalP9GOzm3eqG0QX5QpnvLUTAb+CYQV4Q24PwySsgr0KmWpsbH2SxfjhKpEM6cKr4RDeHnQb0iNq4Q1E +YsnGeJ4isY+vcipmCWWQZ3PsbWZOP0bvugQ1yZAwkgZjVxzPTj5NTy7VxHYH8LGI63ICKBWm4QZQHONY +aYvjTrcnLASrfoUcUZwnjqx4mENyMltgrrrQC1BTZthoAIeQlWm6hV1rxCDLecWzDeZSfCVRwsqEOcoE +xB2GUo4wVtJ/3OlqO7TvcVYvrfzuc78a4lD2KAoYp539nvpUgvTWaeEUw1s4CEn9wa8ojoKGbpuY3GgY +Et/C0GlwKHR6innEIL/HdE0JV7pB6fm+FpfwlA1gKtwGsipSLKmULY0GRHy+JNlCNEfpIqeEL1dQMhzD +3aaSkm4fjlAWEyl+sg1m0pdBGeAHNOeqUGDJEwd/xLShouxVKRNixxPMKbAroaqZQOC17MN0iSHNhcuh +OxEIlPXh2bThwQc1YJmmh7Xic5xJddeqAr3VvEUehIt2KYY59GeW3N7sCop2HQlR3g0TxvmkTBLyAEPY +7e/CG4vFh03yMqsgXXF/66HR9Dkbq3JApftIWG3SxNxIl1Uh1rNrbBKz3OXUCdPXDvDrV5+g4dAfTN0A +cGiw84jU1FJdohRpSWFeUoozoRHMrLv0WKtck2KW839Vk1nvvFIbaqZrTQ9bgKXBTeIBkJ5Ya4P6nBpL +2zdgHFPGtZVVM6vbT05HH8+nE9DGuWAGw1y6jmr7rPSKcNFRUaQb+UeaQlLykppFxvoC34mwLqXRyPMK ++Vp4+fMUIwoo20BB8T3JSwb3KC0xEx26BoRuZV3Bpr/btjye1JWuCSE3Oldpdn0LaTo979x3BzDBKuQw +nZ7LTtW+pywgh2wF7nhrwmqccOFZd+49q/EehjLqky2m+XFJkbR77z11rOfKIO9Qtz3tc57CEO4PQ05A +ALOjfozWHMJ9X/7d2fvfnf8Vv+l2bthqGa+zze3/7P6PPWeHtS3atth7Y46IzROJOSUxxLp3TY63cZYZ +4TCEiEWNXm7e3bodaMiq0vNGYSisUobPMm7bH5hZFIMt5cJhAzjowWoA3+/3YDmA99/v75sVU95EcSR2 +ubK/hNfw7g+2eK2LY3gNf7SlmVP6ft8Wb9zi7z9oCuD1EMobMYZbz8+9t4vPuoieoJmFZwSu2sjcVeK2 +/ZWkLvaWTr/yaFuFb4W+4KPR6DRFi45c3DVHvRJouXw8qVYLao6QjDh+HSrt4HaztwdHo9HsaHw2PTsa +nQuPhXAyR6koloFKGapzYaT0VDQdwJ/+BH/sqmCrG3bZNcEJoY53e7DfFRAZO8rLTGrDfVhhlDGI8yzi +wjQRG5YJpUmt5nj2fbexWBYGu0YimqM0daezEQLSzQPxH4NYhoDKLMYJyXAcucy0IPD24Ftm2Ilm3Agy +hFhrXLWJGCkySdHTM3ehvVixZ3flPIxgqOv+UpJUjCwaRZr3o9HoORhGoxCS0ajCc342mihEKjqyBZkA +DWATxRbdf38cn8wcpDqq9STuql2gh6oy6ml+C3N8ADeW9zeR6C7qQbV+nQDQTSTIiHpKuSKORz+VFI9S +gth0U2AfUpIawqT/xynKWJLT1aC+HHuSrJ4NSASWpzLAJJwTVHAAVPcGRH0dejacE03RbZAYzQyJ4XTr +JlMTRDPj1vaxKRwyGkGXMBK5M6i4pUXimlHacOrtPHbdSH+Y/76qE2N85aphWenzUq1ClDIcWJ030Sjq +gRLzHkRHl6OLk+jWxgd0ZypAYGP/H977YqsFVolvm9jaVk2htVX/LpEdf3j/qwss+60kln54v11eLcDL +pdWi+DZZ1cLw31eXJ52f8gzPSNytBLhR1bY/u+Oq82Db8N2R6z7k4PXfTw29NmrdamD+CAzbN0BC0vZv +Xp6dSnb9IOzIOVxQBXIF+2VqNdcLm3AXn+ol00/TetH1dFwvmlyfNorGP9aLLkd+0xbtIuu7ju1ldtpF +T8K1a5aj0MYth1mdRkyvjq86PCWr7gDOOLClOStEGWBKVbBG9mO8i31hdB28+8/+yxQSWrRXyn5+PyU0 +R4ijRaWEFk+oKdc2VgSa7i/L1R2mASq9VdC0uFnd5K70iZTZ5xlZEjQw81Lqjd1tNqkveCNEqQr59SAm +C8zUpqX+VGiPmzvU7vFk96Vbk+pY1yuGefWWoHYQRZ3e47bC+GT8hjIVMzVOA6S+AmBVyFVD2oIAcDVw +A12VtIL7oN+wBTtSeD0dP08Gr6fjpgQKfacRSeWnUOU0xrRXUJxgirM57smV0BNuHJnL0zH8UDzZoUTY +7FIr2RfKqCStXbYqmtth5GDae9CjbAdQw9+mUH9fyy1DBaeSTwZMfoThKoYZ4Kok3EJpRQ0sP8Jwmo8G +Un+GYRVLDaj6etlymIx/VDJcUCIW66a3xmSx5L0ip/xJkZ2Mf2wKrDQUXiiuhop2aVTkbZHonG6p/b1l +jdF7M8RKftR3CFYN1kCqryDOnFoo8fcLZWHy19NrJQ3VXip30SfMNNkwIAii+MWi8IzdMyHZAtOCkmzL +lP/OJhljy6T4hq1RwjsDs5qjKvomo85MrrKVSoYWuAcMp3jOc9qzZ6bKWJpjyklC5ohjObHT80nAABel +L55WSUH7bBnK2iFcir9xoYPMPXXGInNGGSDYVfC79uznt4wcpAxJrhgo+REEM9ypNgn1HQR2GWUauGUv +UBJVrqrm6RVV2VMPtQiA4xk/dOHrV6gSrR6UJyjjpB+nV5Pr87OpSkMpKJ6rhIkzrny1NSDI8rd50Vfx +UQsvvPpHJdjTT9PnGXTTT9OALAt3+KWhKSNjNW78NvpFKGyuMnawPpJhkNB8JQtKhincY3qHOFn1GzEY +PTfORLeFoPgDN8iHcOM0uD0MgodkSNB6pXM9OM7gbiNp/CGXeeLPCmN5ZARDbE8Q0f+ck6yzu9t9NjV1 +DXrxqWYpPSVwF5+a8nbx6Ve0jX5v62b1EDKPW8ybZ5kkl888lbkMxJ4vJ5WrdnEyORn/eOK5fk48swbg +BvnqyQDwagiBhLqoQgF5lm4Azee44AzyDNtNRZ7DylSX6BuO09wTQZlt4KZNw2O3dqRWETJryz1waNUp +mP0QL2a/xrHwz5CxGefpAO77PNfIuvUAbJVNbkV2xtFdip005Kk85bhJ87U8ml+SxXIA73qQ4fVfEMMD +eH/bA1X9B1P9QVafXQ/g+9tbg0jmE+8ewC/wDn6B9/DLIfwBfoEP8AvAL/D9rs0ESEmGn0oeqdG7Lb2K +CA+uBu9l3QkgSS4MgRR9+ad/piCL6prbT2xWIKEcIoN61l+hQsH1KikkoSZunn25ehfnvEO6zYSjx65S +t1EvqtUGdbxLjEGryN6ekeTwSMy45ZL4aPBJFD7JKQnUwivdheWW+P5d+aUJcjgmyX8ez4TSGsKNparo +p/m62wOnQCyZrl1PeuU44imXg76hkq/1COAXiLqhha+gNdAhRPZA4OyHy6uxCgw7KtktrdZ8ZST2ZPqD +gpoJneX25RT7SciNinqHTlXLmVZNO3sXLry0Z08ra+zT0fiHk2mnsQGFqntAp859o2fSoW936J2iQJxj +mg28k9yBQuzvHJLIi+ur8XQ2HY8uJ6dX4wulfFOpzZV6sonoctetwzf34DpE3fi5iRpdREJrRzpxVv7N +eerbPP9Oayb6c/SEaWJSHevGDuZIk1+pb3lIWW1eyrSpj7Db7FBm4ilonjZj1h/HP5x0HHFRBVYC4v7f +MC4+Zl+yfJ0JAtSZo7YHrmaN9rasFQWnpcUg3K7jy8nk5EgSg+lKGM6xybtEFA9Exe4uwHEuT9gk35VZ +zTDnJFtAx8lJk1lRu3m2CwAnmWCJ04dOVhMeobooJGGTRGAn7ClgO8QKZnZ1acYZ91HJ81mcMYbnMJQ0 +iFEGW52etjdLkrZ2ps08z1gu9v98oY56d+2FHYf8J/1egOsUCz0vtJ03JshpjVyVX27y/ojMtF2hLxiy +XK+EuZRC1ldZ9CvMZNhB5tXGhKGiwMIsyQCZpFyKZe99YQNpJfr69Q68hj9XZO/A6z3vOqY1zztqFTKO +KPfSR/O41YySwDYPtzUFV14XMrm3XtqtoysFkEv0WK42dUHqTqkoORZ5Kwl+Vgbso6p3YEMwecFZX3Z9 +e7N/CyNj4Qut4sIbvgz9Jge3cFWIcpSaZIOcbmtn9QyYO25VHrWXWm0yiuG1YdVUiEBrbhZiTr4zjLJN +pTSVYNxhB5fokOBY32TRd7g1QX3n+H1VcqSvdSzIPc5cslpZIwZjZCcwzIounkvMCqcvfv7+o6KaAruR +HfG3NOL0MmGdnx8VRM+RLrs7BTzyys8W+1DlBr5sM9J2jYJUDF+ie+wM1t6JUqyvtxS4zUQByvQtGrmm +nMt2OrszFCxp9+pdC1ntvFsDRqEN1FiTbrtnGrjPyquqWbjOfHjSFJiT1tkIOXUWuE0debeo8hiGVRPp +0TUAmzdW87jb5kGs8tikOgd8h/AN0y3o9vZA3c3mldTKRaUjbMFGMr0+jx1F9N13TlTXq2rtWQ/GQeJd +HPdwHAYxPAZL7Q1axzaTU9zOrzCBOphzMh5fjQdgzCHvam0UQNkuj8q70wJQN+HrAQF5DyHWN1R+fvQD +AZVG0A9HuDPTiFL9qdpuzA2q2pAFTtvsnMjsCtumMUTp9Fa+LserJ9xdAXKzfxvydZvItfMLde9XTYfc +j980WkVGa+pHIVjj2rJR+C4bgoiqHbQTwuGzKYCg24erLN3A1sbbCJBParBSqfioHtQWDHUzFne8lZym +QuHbbna2KbI6N4KKTEvGsdgziNxVHcnwAlQGWqXXtV0edYS0wlndczsISZLYE8usso3kCyFlYAu0yZge +9puD20BK5rNFqyFi0RYgv+P92634bChYj0wGOxFJG7O+Ta/IG7lWV9zUCRA+qHMI3C4zVqWEZSYgLM+5 +HeemEbbfj6tRtTW6UT2nIidjGJhS5/GQRl3zEQ7biqcD70qSD/JY27ibZmrAnDhsNrGbmgWvZs9vWrfu +/oqyOMXO3WV1Kd5eNWbNi6Sxc4/8u+9azSoh+K+GEB2dzsYnx2fjk6Np9Ez46cnFddUotMCSf8VCadw4 +tPT0ScatPojr73Z32jpzL8I7X4fBhe+ZsTKe074zfRv2ppG8FdwxxOT4Xw291t991+ClzCb8lYh9M4So +H8GbJ2iuaRj/1Y++OR3SrxAFLFC9blWds7K98OcTIQMUx8rb7sTmqol//UT48U4QmCS6RgZLpGPSA8RY +ucJACoGOYsb61sglvL8T8GUCbkzDb/FcFvddp7mnhULaJ/SGkEJno7E7z9BD5vzUe/7H12ia2eGXeWI8 +JzGGO8RwDMKdFqQa+LfWzTZv9DClYCr3GpB6Y8FLjJFNr4Lv8ghY720eCWvSyc9O4eJThVlNmZxHM84d +x9lgwSd5fL/sSUtmpZyxsEmy5dGg6vEgiudhp3Xrqz4v9rbk4Fv9rGd4Was2/2qrd9X0rFyvqvYo0TeC +tfpcjShpw2KyUdOL1veNol7YwtOvHIVro87kCykKki1edaMGRPc5TyE09aP/EhnFcxNCJwVUz6FZK0fn +6yw5LwZ7e4yj+Zf8HtMkzdf9eb7aQ3v/ebD/4Y9/2N87eHfw/ff7AtM9QabBZ3SP2JySgvfRXV5y2SYl +dxTRzd5dSgotd/0lXzlHTdedOPfCsbF8n4X3WZES3on6xgvb24OCYs4Jpm/V8ZJ3gUn+exPf7N924TW8 ++/B9F96AKDi47dZK3jVK3t92a4+0mVPMcuVmHGTlSt5QtheUA1esoqj+LJKTpyDwBdpk5arxJp3S+/Af +gs5AZPq90Dn/JVXP27feNWlBI1wgvuwnaZ5TSfSeHG0lRgJ7x6IXbNDbcyBuHdu7UmlexkkqH6dJCWKY +DVQqEubInKwwSSXJYnJP4hKlVUqHvElzOrseX336x+zq9FRmzc0tyllB84fNAKI8SSJ4lHlR16JIngXc +pTiuo7hsxZD5CHAWan/68fy8DUNSpqmH480YkXRRZhUudfb01jz247JAnj9p2vXxR54kajvMOLGvi/in +UAOfPP1iSCunZrpdxbFAr1mz07ZuLp/sJTOdfMyI0B0onUzOwyOznXy8PPvxZDwZnU8m56GhlAYVY6k/ +Er+T7Nl9XD7VhRqGlOePk+nVRQ+ux1c/nh2fjGFyfXJ0dnp2BOOTo6vxMUz/cX0ycbTCzNzErFbCGKv3 +Yv/N9zFlA3t/MepFXal39N1oPXDj9ASupjluVHuCn3pJN+ptG5d/9wszTjIZJnhWq9/2ZFw/DPwGop5Q +Zeq0vKLYP8fWLPScxyAffffy/zOzjZkfx+dN/n0cn4vtW9e/3z8IgrzfPzBQp+PgVUtZbGAuJwezj+Pz +078fh7IsTZ3Jtpxcn87+8vHsXKxvjr5gVh1LST1dIMrZQJ5Vyz/NK2uT61PjGXR4DncYPudix1ceSQRR +V+4BKbrDqWp+fDlRn/aBm4KSFaIbB1cfOpVG/XMkUw8oWg/g70tMMXTUk8YSS1dZ5bl6Cq7MUKreNzZm +m0On2XgkRdJ7E/RwssKSFOHBCXcILzCVjxdKpeSSoh4RlBZNTz92Xb3FI4mU1pjGi1dFirjCjeKY6JNj +836m4tZcPrwZu+OdsSL5j1gNOkkR5zgbwAhSwrj7rLNqrwH0VisM0SVG8cEARqtcPsANu3dlkmAKNM9X +u+qwWSamSr9yiSEhlHEZ+bdPhxcJzJfyzSHBqAd+gR4m5CesxrVCD2RVroCRn3Dlu04/TS3DflQpJoIY +ePfhgzropJjJBIcMVmXKSZFW+e/O2N99+BB1na3EEcvA1qHUv5LHr1/B+axOVN4F0n5dYbfnEIhDihHj +8A6wfqewYaLqHrXguedAtthVG42GFK2FZ1h9vBoOIYqaqETdEKIZRWtWJBad2vvUWZLMpl1iKxeOXKnd +UcVPCnUqZaCFBeYcMYu1g7kRBWltiZm0B/+iO0mCiU5r9uqMwKhrEVcrz19qO9XLe1pWxbKRLyj+q8RM +JgWaR98BOb07MQ20riE1bFUkabwVZ3VBdVqx7z0UaxsMa/CBdM69PXVIhOLY0iLYoWk0TyhnEZdPF6wK +vtFy7R31bZtxyeSidnjoN+Q8DR7cKx92+mladdDTE9YDWvTUy3QWRffZx/hPIO4+6Wo70268YzHp8pn4 +hIhJVy6C0phiWuuzapr5UyfB7cQZGG99+CikOvRx2GIPjyxpQVTpQB9TVW5RVUWHNVb8sF3K/ZVZ50ZN +AhoTJHVPNUWtU9+Y8icxVXnBXpjEfZVtm+Gwdec/Go227Pgkj3Gims7zjKv3QklaxYo7uU7HqsBnc/0u +3AD+kucpRpk8hMRZLH/mAMtLt1r7EIrjPQPfF6IqNngbovJuVjpPlFCclAzHje4ZK/EAzrU6PhqZX15Q +gYA0X6tfupBwLmpWe+kPOsooUNdQtJiYjVaZUxLHmqTxAEYac9XfXIxZdiIg5ojGod5s9mV/e3/OZuxM +detm/PytsSbgimKrwtWn0JVZnuGo6xfDTXQY3R6GUIgx19DIojAqVWXQWXyWejMsS92rWuMufP1aQfvA +tai2rTL70nAI+1vA9Ei2VbuYVIZGwNpxV2jT2hFzjjNON6JIUZ7TSsBeanrUp0aszfq7Uk6VXbbNR6Wk +ejoajXz1FMlmUQ8cJD3v+Ud3j2p5cOr5qLvN3wgICnC35eSjB6ljb7hSoM5EUpyps5BnUigQVBSKrxty +2+0e7rQtiW8gzBGslxMnZadXR+sSWd9Iji9G46OXbyWyuXVFZ/EK0TkUFCfkQb7zHMc4PoTGHlPkKZlv +NFKJQpVApxh2e+qXl+6wXCV5ojVID6J/lYiijBP1RbH8LRbpAJpj2+s2xIn7Lj6DDvv2jmo7D0rJIhMO +y+T6dACR/lWpvYhFYilHFKfoAcfRXkSjClbSIazqDmJFMuw5rKGRj/b4b2cX34ZXtIAOir+QVQhzgekc +Z3ygTxjhDvM1xhnsy1f5D/b3ewYELZSPqXY2yUFiHn7XWc2dYs7dTg721QOutEQDGJkfQ0KLBcULsZFr +G0BfuamxkpaJ0yhBJFUJ9VuaaCCVGc4G+oS1CiAcmhJpwxDp/twp04TJCRBjFgzr6QbyYBUxhmPpbXSS +3OPhfuR2eyoPCgeg/i/ca8Uqn3TFMetxQYf6M44Smugoi4Q/yzim98KIMn9VmNswkmHXxlXOsqLkJqgi +LNtlHjsP3rorvc2SaNgQjoP0+H9pdchroaZOqYqobkyo+lfN5BRVYTM1HOiGZWMCFHLhN8nTCsEYJtub +qyd/JSB8/QqBOkdVtEBo9RGwEc4y9Xa3q6maPLOpXDfR/VCCHkT2fWtpxcstISqGFWf04A+tGzSxyTGq +qj7cmgYNjzsIFGZAEPS5nGA1YhuBnWAfgYiyYgxzOVNvVPcXR1alCu1Q69FTzm5/bE34fPkkmDzHRwxX +anwQyItvoBDCSgNJj3cUoy+HAex603g2cvYtyGkNr+4y0FsAhdF+Oy3p5L4gSPqqTc6TBj8C4k242gKr +Offno33GJ9enbRM+uT59xnzXoF4w3WJr+rVmW+P+f22yhSEVmGsxF/Wpvrb2TW2eteFTubCm4NVQmjZt +qkVYQY7WVY2aElYzg1itd1oiJ0BdopYQqtczLZHTs2hk46iN/k99s6TRe+L2njyv98TrPXl278LUUpbc +Vjp8+65++yPJhSDvR62vRgeRhJ40CAH2Q2pbOXGi23r6+ePzkAZ0Q4WTvQynXDItPNve4UFrh0GvXTYK +9RLMUJd5vbky4/ajlteSlCAluZSjJG9z9RsCpLP0niE82jpvKZbUKRO8VcpdIfdaN4R8rGOc2nCvU+fZ +96GXvt1cjDp4M1WzCRR8VCaErOVKgTtq4i7tUOtmpL4WJ1dBhumnacfEtVUHSkkcQtRtRMoDeSbb2ttn +Kqbmx63sLfDzPFs4sX7lMy3l7YAYMsTlL2ZClq/dXwP529lFB9H6z5wiagMl9pLtmqKiwFT6WYs0v+t0 +5Z/Or3FCmiMZ+E5IitW594hVR3220w7J4Ie8K6gn+vev8ozTPAWUbdZo05O/+STa6ecD5DG8Cmyri64M +ZYRv3s6XeP5FH0Zf5hwPDGGE6ReWMiWZGUqhzOJ8LvOTcQxLnMqx2HvJk1xenyfydHIjaMrXGVDCvvTd +m8MynjnTvdisE31x5d0tDGH3M9s91InWcww8V5SQbJ6WMYb+Z2bYY5W6+IShpF1dHelkZZr2Kszuj/Y5 +qc0KT0tus6a1I4FaLr/LOj3PE8xtippmu+jv6PxMEEnQnQCtgvPnZzP781nmnrTp3sb8vmAxcKjX135l +hi8Ju/mCN7fSWdq1aZy79fXvAFqc8ruhQd2s0dOT6dFf67/2nGA+X7Ywuz+XP1d1Pbo8O5LL7f8EAAD/ +/+UEljI+fQAA `, }, }