From 3f083275e8e7110a5ec913cd25810308e589444f Mon Sep 17 00:00:00 2001 From: Yaroslav Berkut Date: Tue, 30 Apr 2024 16:30:47 +0300 Subject: [PATCH] Release gbi-event-counter v --- .../gbi-event-counter-0.1.13-dev.d.ts | 29 +++++++++++++++++++ .../gbi-event-counter-0.1.13-dev.min.js | 2 ++ .../gbi-event-counter-0.1.13-dev.min.js.map | 1 + static/javascript/gbi-event-counter-0.d.ts | 29 +++++++++++++++++++ static/javascript/gbi-event-counter-0.min.js | 2 ++ .../javascript/gbi-event-counter-0.min.js.map | 1 + 6 files changed, 64 insertions(+) create mode 100644 static/javascript/gbi-event-counter-0.1.13-dev.d.ts create mode 100644 static/javascript/gbi-event-counter-0.1.13-dev.min.js create mode 100644 static/javascript/gbi-event-counter-0.1.13-dev.min.js.map create mode 100644 static/javascript/gbi-event-counter-0.d.ts create mode 100644 static/javascript/gbi-event-counter-0.min.js create mode 100644 static/javascript/gbi-event-counter-0.min.js.map diff --git a/static/javascript/gbi-event-counter-0.1.13-dev.d.ts b/static/javascript/gbi-event-counter-0.1.13-dev.d.ts new file mode 100644 index 0000000..ef7abd8 --- /dev/null +++ b/static/javascript/gbi-event-counter-0.1.13-dev.d.ts @@ -0,0 +1,29 @@ +declare const _default: { + registerGBIUniversalEventTracker: (options: GBIUniversalEventTrackerOptions) => GBIUniversalEventTracker; +}; +export default _default; + +declare type EventType = 'location-changed' | 'other'; + +export declare interface GBITrackerEvent { + /** Optional string to denote what type of event fired */ + type?: EventType; + /** Optional key value pairs to include in the request */ + metadata?: { + [key: string]: unknown; + }; +} + +export declare interface GBIUniversalEventTracker { + trackEvent: (event?: GBITrackerEvent) => void; +} + +export declare interface GBIUniversalEventTrackerOptions { + customerId: string; + /** if false, the tracker will not add the listener to the history state and track for SPAs */ + listenToPushState?: boolean; + /** optionally override the url this posts to. Default endpoint TBD */ + overrideUrl?: string; +} + +export { } diff --git a/static/javascript/gbi-event-counter-0.1.13-dev.min.js b/static/javascript/gbi-event-counter-0.1.13-dev.min.js new file mode 100644 index 0000000..aca75a3 --- /dev/null +++ b/static/javascript/gbi-event-counter-0.1.13-dev.min.js @@ -0,0 +1,2 @@ +(function(o,t){typeof exports=="object"&&typeof module<"u"?module.exports=t():typeof define=="function"&&define.amd?define(t):(o=typeof globalThis<"u"?globalThis:o||self,o.GBIEventCounter=t())})(this,function(){"use strict";let o,t=[];const p=()=>{const e=window.location;t.forEach(n=>{n(e)})},m=e=>(t.push(e),()=>{t=t.filter(n=>n!==e)}),h=()=>{o={subscribe:m},window.addEventListener("popstate",p)},g=()=>(o||h(),o);let r,c;const y="https://www.gbi-not-defined.com",_=async e=>(await fetch(y,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({customer:c,event:e})})).json(),T=e=>{c=e.customerId,r={send:_}},b=e=>(r||T(e),r);let s,i,a,d,l,u;const w=e=>{console.log("customerId:",i),console.log("listenToPushState:",a),console.log("overrideUrl:",d??"-"),console.log("eventType:",(e==null?void 0:e.type)??"-"),console.log("metadata:",e!=null&&e.metadata?"metadata exists":"-"),u.send({type:(e==null?void 0:e.type)??"other",metadata:(e==null?void 0:e.metadata)??{message:`Sending an event... for "${i}" customer`}})},E=e=>{const{customerId:n,listenToPushState:f,overrideUrl:I}=e;i=n,a=f??!1,d=I??null,u=b({customerId:n}),s={trackEvent:w},f&&(l=g(),l.subscribe(S=>{s.trackEvent({type:"location-changed",metadata:{location:S}})}))};return{registerGBIUniversalEventTracker:e=>(s||E(e),s)}}); +//# sourceMappingURL=gbi-event-counter-0.1.13-dev.min.js.map diff --git a/static/javascript/gbi-event-counter-0.1.13-dev.min.js.map b/static/javascript/gbi-event-counter-0.1.13-dev.min.js.map new file mode 100644 index 0000000..3713c99 --- /dev/null +++ b/static/javascript/gbi-event-counter-0.1.13-dev.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"gbi-event-counter-0.1.13-dev.min.js","sources":["../src/lib/location-observer/location-observer.ts","../src/lib/event-sender/event-sender.ts","../src/gbi-universal-event-tracker/gbi-universal-event-tracker.ts","../src/index.ts"],"sourcesContent":["import type { LocationChangeListener, LocationObserver } from './types.ts';\n\nlet _instance: LocationObserver;\nlet _listeners: LocationChangeListener[] = [];\n\nconst handleLocationChange = () => {\n const location = window.location;\n _listeners.forEach((listener) => {\n listener(location);\n });\n};\n\nconst subscribe = (callback: LocationChangeListener) => {\n _listeners.push(callback);\n return () => {\n _listeners = _listeners.filter((listener) => listener !== callback);\n };\n};\n\nconst init = () => {\n _instance = {\n subscribe,\n };\n\n window.addEventListener('popstate', handleLocationChange);\n /*\n window.addEventListener('popstate', function(event) {\n // This function will be called whenever the browser's history changes\n // You can access the new URL from event.state or document.location\n const newURL = event.state || document.location;\n console.log('Location changed to: ' + newURL);\n });\n */\n};\n\nexport const registerLocationObserver = (): LocationObserver => {\n if (!_instance) {\n init();\n }\n return _instance;\n};\n\nexport default registerLocationObserver;\n","import { EventSender, EventSenderOptions } from './types.ts';\nimport { GBITrackerEvent } from '@/lib/types.ts';\n\nlet _instance: EventSender;\nlet _customerId: string;\nconst _url = 'https://www.gbi-not-defined.com';\n\nconst send = async (event: GBITrackerEvent) => {\n // Default options are marked with *\n const response = await fetch(_url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ customer: _customerId, event }), // body data type must match \"Content-Type\" header\n });\n return response.json(); // parses JSON response into native JavaScript objects\n};\n\nconst init = (options: EventSenderOptions) => {\n _customerId = options.customerId;\n _instance = {\n send,\n };\n};\n\nexport const registerEventSender = (\n options: EventSenderOptions,\n): EventSender => {\n if (!_instance) {\n init(options);\n }\n return _instance;\n};\n\nexport default registerEventSender;\n","// export const libName = GBI__LIB_NAME;\n// export const libVersion = GBI__LIB_VERSION;\n//\n// export default {\n// libName,\n// libVersion\n// };\n\nimport {\n GBIUniversalEventTracker,\n GBIUniversalEventTrackerOptions,\n} from './types.ts';\n\nimport {\n type LocationObserver,\n registerLocationObserver,\n} from '@/lib/location-observer';\nimport type { GBITrackerEvent } from '@/lib/types.ts';\nimport { type EventSender, registerEventSender } from '@/lib/event-sender';\n\nlet _tracker: GBIUniversalEventTracker;\nlet _customerId: string;\n/** if false, the tracker will not add the listener to the history state and track for SPAs */\nlet _listenToPushState: boolean;\n/** optionally override the url this posts to. Default endpoint TBD */\nlet _overrideUrl: string | null;\n\nlet _locationObserver: LocationObserver;\nlet _eventSender: EventSender;\n\nconst trackEvent = (event?: GBITrackerEvent) => {\n console.log('customerId:', _customerId);\n console.log('listenToPushState:', _listenToPushState);\n console.log('overrideUrl:', _overrideUrl ?? '-');\n console.log('eventType:', event?.type ?? '-');\n console.log('metadata:', event?.metadata ? 'metadata exists' : '-');\n _eventSender.send({\n type: event?.type ?? 'other',\n metadata: event?.metadata ?? {\n message: `Sending an event... for \"${_customerId}\" customer`,\n },\n });\n};\n\nconst init = (options: GBIUniversalEventTrackerOptions) => {\n const { customerId, listenToPushState, overrideUrl } = options;\n _customerId = customerId;\n _listenToPushState = listenToPushState ?? false;\n _overrideUrl = overrideUrl ?? null;\n\n _eventSender = registerEventSender({ customerId });\n\n _tracker = {\n trackEvent,\n };\n if (listenToPushState) {\n _locationObserver = registerLocationObserver();\n _locationObserver.subscribe((location) => {\n _tracker.trackEvent({\n type: 'location-changed',\n metadata: { location },\n });\n });\n }\n};\n\nexport const registerGBIUniversalEventTracker = (\n options: GBIUniversalEventTrackerOptions,\n): GBIUniversalEventTracker => {\n if (!_tracker) {\n init(options);\n }\n return _tracker;\n};\n","import { registerGBIUniversalEventTracker } from './gbi-universal-event-tracker';\n\nexport type {\n GBIUniversalEventTracker,\n GBIUniversalEventTrackerOptions,\n} from './gbi-universal-event-tracker';\n\nexport type { GBITrackerEvent } from './lib/types.ts';\n\nexport default {\n registerGBIUniversalEventTracker,\n};\n"],"names":["_instance","_listeners","handleLocationChange","location","listener","subscribe","callback","init","registerLocationObserver","_customerId","_url","send","event","options","registerEventSender","_tracker","_listenToPushState","_overrideUrl","_locationObserver","_eventSender","trackEvent","customerId","listenToPushState","overrideUrl"],"mappings":"gOAEA,IAAIA,EACAC,EAAuC,CAAA,EAE3C,MAAMC,EAAuB,IAAM,CACjC,MAAMC,EAAW,OAAO,SACbF,EAAA,QAASG,GAAa,CAC/BA,EAASD,CAAQ,CAAA,CAClB,CACH,EAEME,EAAaC,IACjBL,EAAW,KAAKK,CAAQ,EACjB,IAAM,CACXL,EAAaA,EAAW,OAAQG,GAAaA,IAAaE,CAAQ,CAAA,GAIhEC,EAAO,IAAM,CACLP,EAAA,CACV,UAAAK,CAAA,EAGK,OAAA,iBAAiB,WAAYH,CAAoB,CAS1D,EAEaM,EAA2B,KACjCR,GACEO,IAEAP,GCpCT,IAAIA,EACAS,EACJ,MAAMC,EAAO,kCAEPC,EAAO,MAAOC,IAED,MAAM,MAAMF,EAAM,CACjC,OAAQ,OACR,QAAS,CACP,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAU,CAAE,SAAUD,EAAa,MAAAG,EAAO,CAAA,CACtD,GACe,OAGZL,EAAQM,GAAgC,CAC5CJ,EAAcI,EAAQ,WACVb,EAAA,CACV,KAAAW,CAAA,CAEJ,EAEaG,EACXD,IAEKb,GACHO,EAAKM,CAAO,EAEPb,GCZT,IAAIe,EACAN,EAEAO,EAEAC,EAEAC,EACAC,EAEJ,MAAMC,EAAcR,GAA4B,CACtC,QAAA,IAAI,cAAeH,CAAW,EAC9B,QAAA,IAAI,qBAAsBO,CAAkB,EAC5C,QAAA,IAAI,eAAgBC,GAAgB,GAAG,EAC/C,QAAQ,IAAI,cAAcL,GAAA,YAAAA,EAAO,OAAQ,GAAG,EAC5C,QAAQ,IAAI,YAAaA,GAAA,MAAAA,EAAO,SAAW,kBAAoB,GAAG,EAClEO,EAAa,KAAK,CAChB,MAAMP,GAAA,YAAAA,EAAO,OAAQ,QACrB,UAAUA,GAAA,YAAAA,EAAO,WAAY,CAC3B,QAAS,4BAA4BH,CAAW,YAClD,CAAA,CACD,CACH,EAEMF,EAAQM,GAA6C,CACzD,KAAM,CAAE,WAAAQ,EAAY,kBAAAC,EAAmB,YAAAC,CAAA,EAAgBV,EACzCJ,EAAAY,EACdL,EAAqBM,GAAqB,GAC1CL,EAAeM,GAAe,KAEfJ,EAAAL,EAAoB,CAAE,WAAAO,CAAA,CAAY,EAEtCN,EAAA,CACT,WAAAK,CAAA,EAEEE,IACFJ,EAAoBV,EAAyB,EAC3BU,EAAA,UAAWf,GAAa,CACxCY,EAAS,WAAW,CAClB,KAAM,mBACN,SAAU,CAAE,SAAAZ,CAAS,CAAA,CACtB,CAAA,CACF,EAEL,QCvDe,CACb,iCDyDAU,IAEKE,GACHR,EAAKM,CAAO,EAEPE,EC7DT"} \ No newline at end of file diff --git a/static/javascript/gbi-event-counter-0.d.ts b/static/javascript/gbi-event-counter-0.d.ts new file mode 100644 index 0000000..ef7abd8 --- /dev/null +++ b/static/javascript/gbi-event-counter-0.d.ts @@ -0,0 +1,29 @@ +declare const _default: { + registerGBIUniversalEventTracker: (options: GBIUniversalEventTrackerOptions) => GBIUniversalEventTracker; +}; +export default _default; + +declare type EventType = 'location-changed' | 'other'; + +export declare interface GBITrackerEvent { + /** Optional string to denote what type of event fired */ + type?: EventType; + /** Optional key value pairs to include in the request */ + metadata?: { + [key: string]: unknown; + }; +} + +export declare interface GBIUniversalEventTracker { + trackEvent: (event?: GBITrackerEvent) => void; +} + +export declare interface GBIUniversalEventTrackerOptions { + customerId: string; + /** if false, the tracker will not add the listener to the history state and track for SPAs */ + listenToPushState?: boolean; + /** optionally override the url this posts to. Default endpoint TBD */ + overrideUrl?: string; +} + +export { } diff --git a/static/javascript/gbi-event-counter-0.min.js b/static/javascript/gbi-event-counter-0.min.js new file mode 100644 index 0000000..aca75a3 --- /dev/null +++ b/static/javascript/gbi-event-counter-0.min.js @@ -0,0 +1,2 @@ +(function(o,t){typeof exports=="object"&&typeof module<"u"?module.exports=t():typeof define=="function"&&define.amd?define(t):(o=typeof globalThis<"u"?globalThis:o||self,o.GBIEventCounter=t())})(this,function(){"use strict";let o,t=[];const p=()=>{const e=window.location;t.forEach(n=>{n(e)})},m=e=>(t.push(e),()=>{t=t.filter(n=>n!==e)}),h=()=>{o={subscribe:m},window.addEventListener("popstate",p)},g=()=>(o||h(),o);let r,c;const y="https://www.gbi-not-defined.com",_=async e=>(await fetch(y,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({customer:c,event:e})})).json(),T=e=>{c=e.customerId,r={send:_}},b=e=>(r||T(e),r);let s,i,a,d,l,u;const w=e=>{console.log("customerId:",i),console.log("listenToPushState:",a),console.log("overrideUrl:",d??"-"),console.log("eventType:",(e==null?void 0:e.type)??"-"),console.log("metadata:",e!=null&&e.metadata?"metadata exists":"-"),u.send({type:(e==null?void 0:e.type)??"other",metadata:(e==null?void 0:e.metadata)??{message:`Sending an event... for "${i}" customer`}})},E=e=>{const{customerId:n,listenToPushState:f,overrideUrl:I}=e;i=n,a=f??!1,d=I??null,u=b({customerId:n}),s={trackEvent:w},f&&(l=g(),l.subscribe(S=>{s.trackEvent({type:"location-changed",metadata:{location:S}})}))};return{registerGBIUniversalEventTracker:e=>(s||E(e),s)}}); +//# sourceMappingURL=gbi-event-counter-0.1.13-dev.min.js.map diff --git a/static/javascript/gbi-event-counter-0.min.js.map b/static/javascript/gbi-event-counter-0.min.js.map new file mode 100644 index 0000000..3713c99 --- /dev/null +++ b/static/javascript/gbi-event-counter-0.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"gbi-event-counter-0.1.13-dev.min.js","sources":["../src/lib/location-observer/location-observer.ts","../src/lib/event-sender/event-sender.ts","../src/gbi-universal-event-tracker/gbi-universal-event-tracker.ts","../src/index.ts"],"sourcesContent":["import type { LocationChangeListener, LocationObserver } from './types.ts';\n\nlet _instance: LocationObserver;\nlet _listeners: LocationChangeListener[] = [];\n\nconst handleLocationChange = () => {\n const location = window.location;\n _listeners.forEach((listener) => {\n listener(location);\n });\n};\n\nconst subscribe = (callback: LocationChangeListener) => {\n _listeners.push(callback);\n return () => {\n _listeners = _listeners.filter((listener) => listener !== callback);\n };\n};\n\nconst init = () => {\n _instance = {\n subscribe,\n };\n\n window.addEventListener('popstate', handleLocationChange);\n /*\n window.addEventListener('popstate', function(event) {\n // This function will be called whenever the browser's history changes\n // You can access the new URL from event.state or document.location\n const newURL = event.state || document.location;\n console.log('Location changed to: ' + newURL);\n });\n */\n};\n\nexport const registerLocationObserver = (): LocationObserver => {\n if (!_instance) {\n init();\n }\n return _instance;\n};\n\nexport default registerLocationObserver;\n","import { EventSender, EventSenderOptions } from './types.ts';\nimport { GBITrackerEvent } from '@/lib/types.ts';\n\nlet _instance: EventSender;\nlet _customerId: string;\nconst _url = 'https://www.gbi-not-defined.com';\n\nconst send = async (event: GBITrackerEvent) => {\n // Default options are marked with *\n const response = await fetch(_url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ customer: _customerId, event }), // body data type must match \"Content-Type\" header\n });\n return response.json(); // parses JSON response into native JavaScript objects\n};\n\nconst init = (options: EventSenderOptions) => {\n _customerId = options.customerId;\n _instance = {\n send,\n };\n};\n\nexport const registerEventSender = (\n options: EventSenderOptions,\n): EventSender => {\n if (!_instance) {\n init(options);\n }\n return _instance;\n};\n\nexport default registerEventSender;\n","// export const libName = GBI__LIB_NAME;\n// export const libVersion = GBI__LIB_VERSION;\n//\n// export default {\n// libName,\n// libVersion\n// };\n\nimport {\n GBIUniversalEventTracker,\n GBIUniversalEventTrackerOptions,\n} from './types.ts';\n\nimport {\n type LocationObserver,\n registerLocationObserver,\n} from '@/lib/location-observer';\nimport type { GBITrackerEvent } from '@/lib/types.ts';\nimport { type EventSender, registerEventSender } from '@/lib/event-sender';\n\nlet _tracker: GBIUniversalEventTracker;\nlet _customerId: string;\n/** if false, the tracker will not add the listener to the history state and track for SPAs */\nlet _listenToPushState: boolean;\n/** optionally override the url this posts to. Default endpoint TBD */\nlet _overrideUrl: string | null;\n\nlet _locationObserver: LocationObserver;\nlet _eventSender: EventSender;\n\nconst trackEvent = (event?: GBITrackerEvent) => {\n console.log('customerId:', _customerId);\n console.log('listenToPushState:', _listenToPushState);\n console.log('overrideUrl:', _overrideUrl ?? '-');\n console.log('eventType:', event?.type ?? '-');\n console.log('metadata:', event?.metadata ? 'metadata exists' : '-');\n _eventSender.send({\n type: event?.type ?? 'other',\n metadata: event?.metadata ?? {\n message: `Sending an event... for \"${_customerId}\" customer`,\n },\n });\n};\n\nconst init = (options: GBIUniversalEventTrackerOptions) => {\n const { customerId, listenToPushState, overrideUrl } = options;\n _customerId = customerId;\n _listenToPushState = listenToPushState ?? false;\n _overrideUrl = overrideUrl ?? null;\n\n _eventSender = registerEventSender({ customerId });\n\n _tracker = {\n trackEvent,\n };\n if (listenToPushState) {\n _locationObserver = registerLocationObserver();\n _locationObserver.subscribe((location) => {\n _tracker.trackEvent({\n type: 'location-changed',\n metadata: { location },\n });\n });\n }\n};\n\nexport const registerGBIUniversalEventTracker = (\n options: GBIUniversalEventTrackerOptions,\n): GBIUniversalEventTracker => {\n if (!_tracker) {\n init(options);\n }\n return _tracker;\n};\n","import { registerGBIUniversalEventTracker } from './gbi-universal-event-tracker';\n\nexport type {\n GBIUniversalEventTracker,\n GBIUniversalEventTrackerOptions,\n} from './gbi-universal-event-tracker';\n\nexport type { GBITrackerEvent } from './lib/types.ts';\n\nexport default {\n registerGBIUniversalEventTracker,\n};\n"],"names":["_instance","_listeners","handleLocationChange","location","listener","subscribe","callback","init","registerLocationObserver","_customerId","_url","send","event","options","registerEventSender","_tracker","_listenToPushState","_overrideUrl","_locationObserver","_eventSender","trackEvent","customerId","listenToPushState","overrideUrl"],"mappings":"gOAEA,IAAIA,EACAC,EAAuC,CAAA,EAE3C,MAAMC,EAAuB,IAAM,CACjC,MAAMC,EAAW,OAAO,SACbF,EAAA,QAASG,GAAa,CAC/BA,EAASD,CAAQ,CAAA,CAClB,CACH,EAEME,EAAaC,IACjBL,EAAW,KAAKK,CAAQ,EACjB,IAAM,CACXL,EAAaA,EAAW,OAAQG,GAAaA,IAAaE,CAAQ,CAAA,GAIhEC,EAAO,IAAM,CACLP,EAAA,CACV,UAAAK,CAAA,EAGK,OAAA,iBAAiB,WAAYH,CAAoB,CAS1D,EAEaM,EAA2B,KACjCR,GACEO,IAEAP,GCpCT,IAAIA,EACAS,EACJ,MAAMC,EAAO,kCAEPC,EAAO,MAAOC,IAED,MAAM,MAAMF,EAAM,CACjC,OAAQ,OACR,QAAS,CACP,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAU,CAAE,SAAUD,EAAa,MAAAG,EAAO,CAAA,CACtD,GACe,OAGZL,EAAQM,GAAgC,CAC5CJ,EAAcI,EAAQ,WACVb,EAAA,CACV,KAAAW,CAAA,CAEJ,EAEaG,EACXD,IAEKb,GACHO,EAAKM,CAAO,EAEPb,GCZT,IAAIe,EACAN,EAEAO,EAEAC,EAEAC,EACAC,EAEJ,MAAMC,EAAcR,GAA4B,CACtC,QAAA,IAAI,cAAeH,CAAW,EAC9B,QAAA,IAAI,qBAAsBO,CAAkB,EAC5C,QAAA,IAAI,eAAgBC,GAAgB,GAAG,EAC/C,QAAQ,IAAI,cAAcL,GAAA,YAAAA,EAAO,OAAQ,GAAG,EAC5C,QAAQ,IAAI,YAAaA,GAAA,MAAAA,EAAO,SAAW,kBAAoB,GAAG,EAClEO,EAAa,KAAK,CAChB,MAAMP,GAAA,YAAAA,EAAO,OAAQ,QACrB,UAAUA,GAAA,YAAAA,EAAO,WAAY,CAC3B,QAAS,4BAA4BH,CAAW,YAClD,CAAA,CACD,CACH,EAEMF,EAAQM,GAA6C,CACzD,KAAM,CAAE,WAAAQ,EAAY,kBAAAC,EAAmB,YAAAC,CAAA,EAAgBV,EACzCJ,EAAAY,EACdL,EAAqBM,GAAqB,GAC1CL,EAAeM,GAAe,KAEfJ,EAAAL,EAAoB,CAAE,WAAAO,CAAA,CAAY,EAEtCN,EAAA,CACT,WAAAK,CAAA,EAEEE,IACFJ,EAAoBV,EAAyB,EAC3BU,EAAA,UAAWf,GAAa,CACxCY,EAAS,WAAW,CAClB,KAAM,mBACN,SAAU,CAAE,SAAAZ,CAAS,CAAA,CACtB,CAAA,CACF,EAEL,QCvDe,CACb,iCDyDAU,IAEKE,GACHR,EAAKM,CAAO,EAEPE,EC7DT"} \ No newline at end of file