tweb/public/709.3b68b61e4cee113d539e.chunk.js.map
Eduard Kuzmenko 3cc5df683e Build
2022-08-22 13:05:40 +02:00

1 line
35 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"709.3b68b61e4cee113d539e.chunk.js","mappings":"oIAmBA,MA2BA,EA3Be,CAACA,EAAmBC,EAAyB,MAC1D,MAAMC,EAA4BC,SAASC,cAAcH,EAAQI,MAAQ,MAAQ,UAuBjF,OAtBAH,EAAOF,UAAYA,GAAaC,EAAQK,KAAO,UAAYL,EAAQK,KAAO,IAEtEL,EAAQM,WACPN,EAAQO,cACTN,EAAOO,UAAUC,IAAI,cAGvB,OAAOR,IAGND,EAAQU,YACTT,EAAOO,UAAUC,IAAI,kBAGpBT,EAAQW,UACTV,EAAOW,aAAa,WAAY,QAG/BZ,EAAQa,MACTZ,EAAOa,QAAO,QAAKd,EAAQa,OAGtBZ,I,yGC5BT,IAmBIc,EAnBAC,GAAM,EAqBK,SAASC,EAAwBC,GAC3CF,IAnBAD,IACIA,EAAgB,oCAA0CI,MAAMC,GAClEA,EAAOC,sBAAwB,2BAGzBC,QAAQC,IAAI,CACjBH,EACA,gBAAgBA,EAAOC,oBAAqB,CAAC,6BAC7C,0BAGK,OASDF,MAAK,EAAEC,EAAQI,MACvB,IAAIJ,EACF,OAGF,MAAMK,EAA2B,GACjCD,EAAQE,SAASC,IACf,MAAMC,EAAe,iBAAiBD,EAAOE,KACzCD,IAIJH,EAAOK,KAAKF,GACZ,iBAAiBD,EAAOE,IAAoBF,OAG9C,MAAME,EAAmB,2BACnBE,GAAoB,OAAO,4DAA6D,CAAClB,KAAMgB,IACrGE,EAAkBC,iBAAiBxB,UAAUyB,OAAO,SACpD,OAAU,CAACpB,KAAM,CAAC,YAAYgB,GAAK,MAASV,MAAK,KAC/Ce,OAAOC,uBAAsB,KAC3BjB,EAASJ,OAAOiB,SAIpB,qBAA2B,mBAAmB,KAC5CA,EAAkBE,WACjB,CAACG,MAAM,IAEVX,EAAOC,SAASC,IACd,iBAAiBA,EAAOE,IAAoBF,OAG9C,QAAiBI,GAAoBM,KACnC,OAAYA,GAEZrB,GAAM,EAENe,EAAkBpB,UAAW,GAC7B,OAAaoB,GAEb,iBAAiBX,EAAOC,6B,cCvEvB,SAASiB,EAAaC,EAAeC,GAAY,GACtD,MAAMC,EAAO,wMAKb,GAAGD,EAAW,CACZ,MAAME,EAAMxC,SAASC,cAAc,OAQnC,OAPAuC,EAAIlC,UAAUC,IAAI,aAClBiC,EAAIC,UAAYF,EAEbF,GACDA,EAAKK,YAAYF,GAGZA,EAIT,OADAH,EAAKM,mBAAmB,YAAaJ,GAC9BF,EAAKP,iBAKP,SAASc,EAAgBP,EAAyBlC,EAAO,SAK9D,OAJAkC,EAAK/B,UAAUyB,OAAO,SAAW5B,GACjCkC,EAAK5B,UAAW,EAChB2B,EAAaC,GAEN,KACLA,EAAKI,UAAY,GACjBJ,EAAK/B,UAAUC,IAAI,SAAWJ,GAC9BkC,EAAKQ,gBAAgB,a,gCAVzB,gBAA8BT,G,sFClB9B,IAAIU,EAAgB,EACL,SAASC,EACtBV,EACAW,EAAoD,KAAM5B,QAAQ6B,WAClEC,EAA8B,KAC9BC,GAAU,EACVC,EAAmBf,GAGnB,GAAGA,EAAKgB,cAAc,aAAc,OACpChB,EAAK/B,UAAUC,IAAI,MAEnB,MAAM+C,EAAItD,SAASC,cAAc,OAUjC,IAAIsD,EATJD,EAAEhD,UAAUC,IAAI,YAEC8B,EAAK/B,UAAUkD,SAAS,cAEvCF,EAAEhD,UAAUC,IAAI,aAGlB8B,EAAKc,EAAU,UAAY,UAAUG,GAIrC,MAAMG,EAAa,CAACC,EAAiBC,KACnC,MAAMC,EAAYC,KAAKC,MACjBzB,EAAOrC,SAASC,cAAc,OAE9B8D,EAAUjB,IAIVkB,EAAgG,KAApFhC,OAAOiC,iBAAiBX,GAAGY,iBAAiB,qBAAqBC,QAAQ,IAAK,IAGhGZ,EAAU,KAMR,MAAMa,EAAcP,KAAKC,MAAQF,EAC3BS,EAAK,KAET,YAAqB,KACnBhC,EAAKN,YAGJmB,GAAOA,EAAMa,IAElB,GAAGK,EAAcJ,EAAU,CACzB,MAAMM,EAAQC,KAAKC,IAAIR,EAAWI,EAAaJ,EAAW,GAC1DS,YAAW,IAAMpC,EAAK/B,UAAUC,IAAI,WAAWgE,KAAKC,IAAIF,EAAQN,EAAW,EAAG,IAE9ES,WAAWJ,EAAIC,QAEfjC,EAAK/B,UAAUC,IAAI,UACnBkE,WAAWJ,EAAIL,EAAW,GAGxB,KACFhC,OAAO0C,oBAAoB,cAAenB,GAG5CA,EAAU,KACVoB,GAAkB,GAIpB3B,GAAYA,EAASe,GAerB/B,OAAOC,uBAAsB,KAC3B,MAAM2C,EAAOtB,EAAEuB,wBACfxC,EAAK/B,UAAUC,IAAI,oBAEnB,MAAMuE,EAASpB,EAAUkB,EAAKG,KACxBC,EAASrB,EAAUiB,EAAKK,IAGxBC,EADSX,KAAKY,KAAK,SAACZ,KAAKa,IAAIJ,EAASJ,EAAKS,OAAS,GAAKT,EAAKS,OAAS,EAAM,GAAI,SAACd,KAAKa,IAAIN,EAASF,EAAKU,MAAQ,GAAKV,EAAKU,MAAQ,EAAM,IAIzIC,EAAIT,EAASI,EAAO,EACpBM,EAAIR,EAASE,EAAO,EAI1B7C,EAAKoD,MAAMH,MAAQjD,EAAKoD,MAAMJ,OAASH,EAAO,KAC9C7C,EAAKoD,MAAMV,KAAOQ,EAAI,KACtBlD,EAAKoD,MAAMR,IAAMO,EAAI,KAgBrBlC,EAAE1C,OAAOyB,OAQPqD,EAAoBvD,GAAaA,EAAEwD,SAAWtD,IAClD,CAAC,SAAU,KAAKuD,SAAUzD,EAAEwD,OAAuBE,WACjD,OAAgB1D,EAAEwD,OAAuB,cAAgBrC,KAE3DF,IAAqBf,KAClB,OAAcF,EAAEwD,OAAuBvC,IAI5C,IAAIuB,GAAkB,EACtB,GAAG,IAAoB,CACrB,MAAMmB,EAAW,KACfvC,GAAWA,KAGbH,EAAiB2C,iBAAiB,cAAe5D,IAC/C,IAAI,+BACF,OAIF,GAAGA,EAAE6D,QAAQC,OAAS,GAAKtB,GAAmBe,EAAiBvD,GAC7D,OAIFwC,GAAkB,EAElB,MAAM,QAACjB,EAAO,QAAEC,GAAWxB,EAAE6D,QAAQ,GACrCvC,EAAWC,EAASC,GACpBP,EAAiB2C,iBAAiB,WAAYD,EAAU,CAAC5D,MAAM,IAE/DF,OAAO+D,iBAAiB,aAAc5D,IACpCA,EAAE+D,cAAe,EACjB/D,EAAEgE,kBACFL,IACA1C,EAAiBsB,oBAAoB,WAAYoB,KAChD,CAAC5D,MAAM,MACT,CAACkE,SAAS,SAEbhD,EAAiB2C,iBAAiB,aAAc5D,IAC9C,IAAI,CAAC,EAAG,GAAGyD,SAASzD,EAAEpC,QACpB,OAGF,IAAI,+BACF,OAIF,GAAuC,MAApCqD,EAAiBiD,QAAQtD,QAAkB2C,EAAiBvD,GAC7D,OACK,GAAGwC,EAER,YADAA,GAAkB,GAIpB,MAAM,QAACjB,EAAO,QAAEC,GAAWxB,EAC3BsB,EAAWC,EAASC,GACpB3B,OAAO+D,iBAAiB,UAAWxC,EAAS,CAACrB,MAAM,EAAMkE,SAAS,IAClEpE,OAAO+D,iBAAiB,cAAexC,EAAS,CAACrB,MAAM,EAAMkE,SAAS,MACrE,CAACA,SAAS,M,eCvMF,SAASE,EAASC,EAA+BC,GAC9D,MAAMC,EAAMF,EAAON,OACnB,GAAGQ,IAAQD,EAAOP,OAChB,OAAO,EAGT,IAAI,IAAIS,EAAI,EAAGA,EAAID,IAAOC,EACxB,GAAGH,EAAOG,KAAOF,EAAOE,GACtB,OAAO,EAIX,OAAO,E,6FCgET,MAAMC,EAAgB,IAjEtB,oBACU,KAAAC,SAGH,GACG,KAAAC,IAAM,UAAa,MACnB,KAAAC,WAAY,EAEZC,GAAGC,EAAuChE,GAChD,IAAIiE,EAAUC,KAAKN,SAASI,GAU5B,OATIC,IACFC,KAAKC,gBACLF,EAAUC,KAAKN,SAASI,IAAQ,eAGlBI,IAAbpE,GACDiE,EAAQhG,MAAK,IAAM+B,MAGdiE,EAGFI,QAAQrE,GACb,OAAOkE,KAAKH,GAAG,OAAQ/D,GAGlBsE,OAAOtE,GACZ,OAAOkE,KAAKH,GAAG,QAAS/D,GAQnBuE,cAAcC,EAAsBxE,GACzC,MAAMyE,GAAc,OAAQD,GACtBP,EAAUQ,EAAcP,KAAKI,SAAWlG,QAAQ6B,UAUtD,YARgBmE,IAAbpE,IACEyE,EACDzE,IAEAiE,EAAQhG,MAAK,IAAM+B,OAIhBiE,EAGDE,gBACFD,KAAKJ,YACPI,KAAKJ,WAAY,EAEjBI,KAAKL,KAAI,KACPK,KAAKN,SAASc,MAAQR,KAAKN,SAASc,KAAKzE,UACzCiE,KAAKN,SAASe,OAAST,KAAKN,SAASe,MAAM1E,UAE3CiE,KAAKJ,WAAY,EACjBI,KAAKN,SAAW,SAOxB,OAAmB,mBAA+BD,GAClD,W,0ICzDO,SAASiB,EAAcC,GAC5B,OAAOA,EAAS,GACdA,EAAS,GACTA,EAAS,GACPA,EAAS,GACTA,EAAS,GACPA,EAAS,EACE,KAAXA,EACE,GACW,KAAXA,EACE,GACA,G,0SC+MZ,IAAIhH,EACJ,MAAM,EAAO,IAAI,IAAK,eAAe,GAAM,IAClCA,IACN,KAEGA,IAAeA,EA9NW,OAAD,6BAC7B,MACMiH,EADc,EAAKC,OACI1E,cAAc,eAE3C,IAAI2E,GAAY,EAAA5F,EAAA,GAAa0F,GAAU,GAEvC,MAAMG,EAAejI,SAASC,cAAc,OAC5CgI,EAAa3H,UAAUC,IAAI,iBAE3B,MAAM2H,GAAU,OAAO,4DAA6D,CAACvH,KAAM,oBAC3FsH,EAAarH,OAAOsH,IAEpB,OAAwBD,GAExB,MAAME,EAAYL,EAASM,cAErBC,EAAKrI,SAASC,cAAc,OAClC,QAAMoI,EAAI,kBAEV,MAAMC,EAAWtI,SAASC,cAAc,MACxCqI,EAAShI,UAAUC,IAAI,kBACtB,CAAC,iBAAkB,iBAAkB,kBAAoCiB,SAASG,IACjF,MAAM4G,EAAKvI,SAASC,cAAc,MAClCsI,EAAG3H,QAAO,QAAKe,IACf2G,EAAS1H,OAAO2H,MAGlBJ,EAAUvH,OAAOyH,EAAIC,EAAUL,GAE/BC,EAAQnC,iBAAiB,SAAS,KAChC,6DAAuB9E,MAAMuH,GAAMA,EAAEC,QAAQC,UAC7CC,GAAO,KAGT,MAGMC,SAHgBxH,QAAQC,IAAI,CAChC,sCAE4B,GAAGoH,QAEjC,IAAIE,GAAO,EACXE,EAAA,mBAA2B,aAAa,KACtCF,GAAO,EACP9H,EAAgB,OACf,CAACqB,MAAM,IAEV,MAAMpC,EAA6C,CAACgJ,cAAc,GAClE,IAAIC,EAEJ,MAAMC,EAAgBC,GAAoB,OAAD,6BACvC,IACE,IAAIC,QAAmBL,EAAA,gCAAwC,wBAAyB,CACtFM,OAAQ,OACRC,SAAU,SACVC,WAAY,IACX,CAACP,cAAc,IAclB,GAZoB,6BAAjBI,EAAWI,IACRxJ,EAAQyJ,OACVzJ,EAAQyJ,KAAOL,EAAWM,MAC1BX,EAAA,kCAA0CK,EAAWM,QAIvDN,QAAmBL,EAAA,gCAAwC,wBAAyB,CAClFY,MAAOP,EAAWO,OACjB3J,IAGe,2BAAjBoJ,EAAWI,EAAgC,CAC5C,MAAMI,EAAgBR,EAAWQ,cAGjC,OAFAb,EAAA,8BAAsCa,EAAcC,MACpD,8BAAmB1I,MAAMuH,GAAMA,EAAEC,QAAQC,WAClC,EAOT,IAAIK,KAAc,EAAAzC,EAAA,GAASyC,EAAWG,EAAWO,OAAQ,CACvDV,EAAYG,EAAWO,MAEvB,MACMG,EAAM,oBDzGL,SAAuBC,GACpC,IAAIC,EACAC,EAAS,GAEb,IAAI,IAAIC,EAAOH,EAAM5D,OAAQgE,EAAU,EAAGC,EAAO,EAAGA,EAAOF,IAAQE,EACjEJ,EAAOI,EAAO,EACdD,GAAWJ,EAAMK,KAAU,KAAOJ,EAAO,IAC7B,IAATA,GAAcE,EAAOE,GAAS,IAC/BH,GAAUI,OAAOC,aACfxC,EAAcqC,IAAY,GAAK,IAC/BrC,EAAcqC,IAAY,GAAK,IAC/BrC,EAAcqC,IAAY,EAAI,IAC9BrC,EAAwB,GAAVqC,IAEhBA,EAAU,GAId,OAAOF,EAAO5F,QAAQ,aAAc,KCsFdkG,CAAcnB,EAAWO,OCtGlCtF,QAAQ,MAAO,KAAKA,QAAQ,MAAO,KAAKA,QAAQ,OAAQ,IDyGzDsB,EAAQzD,OAAOiC,iBAAiBjE,SAASsK,iBACzCC,EAAe9E,EAAMvB,iBAAiB,mBAAmBsG,OACzDC,EAAYhF,EAAMvB,iBAAiB,wBAAwBsG,OAC3DE,EAAejF,EAAMvB,iBAAiB,mBAAmBsG,OAEzDG,QAAgBC,MAAM,8BAC3B3J,MAAM4J,GAAQA,EAAIlK,SAClBM,MAAMN,IACLA,EAAOA,EAAKwD,QAAQ,gBAAiB,KAAKuG,OAC1C,MAAMI,EAAO,IAAIC,KAAK,CAACpK,GAAO,CAACqK,KAAM,gCAGrC,OAAO,IAAI5J,SAAiB6B,IAC1B,MAAMgI,EAAS,IAAIC,WACnBD,EAAOE,OAAUhJ,IACfc,EAAQd,EAAEwD,OAAOoE,SAEnBkB,EAAOG,cAAcN,SAKnBO,EAAS,IAAIzC,EAAc,CAC/BtD,MAAO,IAAMtD,OAAOsJ,iBACpBjG,OAAQ,IAAMrD,OAAOsJ,iBACrBC,KAAM3B,EACN4B,MAAOb,EACPc,YAAa,CACXC,MAAOjB,EACPO,KAAM,WAERW,qBAAsB,CACpBX,KAAM,iBAERY,aAAc,CACZC,UAAW,EACXC,OAAQ,GAEVC,kBAAmB,CACjBL,MAAOnB,GAETyB,UAAW,CACTC,qBAAsB,OAO1B,IAAIhF,EAHJoE,EAAOzK,OAAOkH,GACbA,EAASoE,UAAgC5L,UAAUC,IAAI,aAItD0G,EADCoE,EAAOc,gBACEd,EAAOc,gBAEP/K,QAAQgL,KAAK,EACrB,EAAAC,EAAA,GAAM,KACN,IAAIjL,SAAe6B,IACjBoI,EAAOiB,QAAQC,OAAOxG,iBAAiB,QAAQ,KAC7C/D,OAAOC,uBAAsB,IAAMgB,QAClC,CAACf,MAAM,eAMV+E,EAAQhG,MAAK,KACjB,GAAG+G,EAAW,CACZA,EAAUvC,MAAM+G,UAAY,yBAE5B,MAAMC,EAAI3E,EAAS4E,SAAS,GAC5BD,EAAEhH,MAAMkH,QAAU,OAClBF,EAAEhH,MAAM+G,UAAY,yBACpB/H,YAAW,KACTgI,EAAEhH,MAAMkH,QAAU,KACjB,KAEHlI,YAAW,KACTgI,EAAEhH,MAAM+G,UAAY,KACnB,KACHxE,OAAYZ,OAEZwF,MAAMC,KAAK/E,EAAS4E,UAAUI,MAAM,GAAI,GAAGtL,SAASuL,IAClDA,EAAGhL,eAMX,GAAGkH,EAAQ,CACT,MAAM+D,EAAYnJ,KAAKC,MAAQ,IACzBmJ,EAAO/D,EAAWgE,QAAUF,SAAkBnE,EAAA,oDAE9C,EAAAwD,EAAA,GAAMY,EAlLG,EAkLqB,IAAuB,IAAMA,EAAO,IAE1E,MAAME,GAeN,MAbO,4BADCA,EAAiBnC,MAErBoC,QAAQC,KAAK,uCACZF,EAAiBG,SAAU,EAC5B,sDAAyBrM,MAAMuH,GAAMA,EAAEC,QAAQC,UAC/CC,GAAO,EACP9H,EAAgB,OAGhBuM,QAAQG,MAAM,6BAA8BJ,GAC5CxE,GAAO,IAIJ,EAGT,OAAO,KAKT,MAAO,IAAW,OAAD,6BAGf,IAFAA,GAAO,GAGFA,WAIqBK,GAAQ,cAcpCnI,EAAcI,MAAMuM,IAClBA,OAGF3E,EAAA,uCAA+C,YAAa,CAACS,EAAG,uBAGlE","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport ripple from './ripple';\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true,\r\n onlyMobile: true,\r\n icon: string,\r\n rippleSquare: true,\r\n text: LangPackKey,\r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType<typeof getLang>;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"preloader-circular\" viewBox=\"25 25 50 50\">\r\n <circle class=\"preloader-path\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-miterlimit=\"10\"/>\r\n </svg>`;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n\r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf<HTMLElement>) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport rootScope from '../lib/rootScope';\r\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement,\r\n callback: (id: number) => Promise<boolean | void> = () => Promise.resolve(),\r\n onEnd: (id: number) => void = null,\r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n // return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n\r\n const r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n // let animationEndPromise: Promise<number>;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n\r\n // console.log('ripple drawRipple');\r\n\r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n // console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n // handler = () => animationEndPromise.then((duration) => {\r\n // console.log('ripple animation was:', duration);\r\n\r\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n // return;\r\n const elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n\r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n const delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n // });\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n // console.log('ripple after promise', Date.now() - startTime);\r\n // console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n\r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n // r.classList.add('active');\r\n // handler();\r\n });\r\n // });\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\r\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem ||\r\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n const touchEnd = () => {\r\n handler && handler();\r\n };\r\n\r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n // console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n\r\n // console.log('touchstart', e);\r\n touchStartFired = true;\r\n\r\n const {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n\r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n\r\n const {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {fastRaf} from './schedulers';\r\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise<void>,\r\n write: CancellablePromise<void>\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise<void>();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element\r\n * @param callback\r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","export default function bytesToBase64(bytes: number[] | Uint8Array) {\n let mod3: number;\n let result = '';\n\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if(mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(\n uint6ToBase64(nUint24 >>> 18 & 63),\n uint6ToBase64(nUint24 >>> 12 & 63),\n uint6ToBase64(nUint24 >>> 6 & 63),\n uint6ToBase64(nUint24 & 63)\n );\n nUint24 = 0;\n }\n }\n\n return result.replace(/A(?=A$|$)/g, '=');\n}\n\nexport function uint6ToBase64(nUint6: number) {\n return nUint6 < 26 ?\n nUint6 + 65 :\n nUint6 < 52 ?\n nUint6 + 71 :\n nUint6 < 62 ?\n nUint6 - 4 :\n nUint6 === 62 ?\n 43 :\n nUint6 === 63 ?\n 47 :\n 65;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {DcId} from '../types';\r\nimport Page from './page';\r\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nconst onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then((m) => m.default.mount());\r\n stop = true;\r\n });\r\n\r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n\r\n const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n\r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\r\n // continue;\r\n }\r\n\r\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n rootScope.managers.apiManager.setUser(authorization.user);\r\n import('./pageIm').then((m) => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n const encoded = bytesToBase64(loginToken.token);\r\n const url = 'tg://login?token=' + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then((res) => res.text())\r\n .then((text) => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise<string>((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n // return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: 'L'\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise<void>;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise<void>((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach((el) => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n const timestamp = Date.now() / 1000;\r\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\r\n\r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then((m) => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n\r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise<void>>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n // console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then((func) => {\r\n func();\r\n });\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","lastElementChild","remove","window","requestAnimationFrame","once","e","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","setButtonLoader","removeAttribute","rippleClickId","ripple","callback","resolve","onEnd","prepend","attachListenerTo","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","delay","Math","max","setTimeout","removeEventListener","touchStartFired","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","isRippleUnneeded","target","includes","tagName","touchEnd","addEventListener","touches","length","cancelBubble","stopPropagation","passive","dataset","bytesCmp","bytes1","bytes2","len","i","sequentialDom","promises","raf","scheduled","do","kind","promise","this","scheduleFlush","undefined","measure","mutate","mutateElement","element","isConnected","read","write","uint6ToBase64","nUint6","imageDiv","pageEl","preloader","inputWrapper","btnBack","container","parentElement","h4","helpList","li","m","default","mount","stop","QRCodeStyling","rootScope","ignoreErrors","prevToken","iterate","isLoop","loginToken","api_id","api_hash","except_ids","_","dcId","dc_id","token","authorization","user","url","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","reader","FileReader","onload","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","Array","from","slice","el","timestamp","diff","expires","err","console","warn","handled","error","func"],"sourceRoot":""}